class A // blah blah generic abstracty whatever
{
public:
A();
~A();
};
class B
{
public:
B();
~B();
private:
A* a[8];
};
B::B()
{
for(int x = 0; x < 8; x++)
{
a[x] = new A;
}
}
B::~B()
{
for(int x = 0; x < 8; x++)
{
delete a[x];
}
}我只是好奇上面的代码会不会自行泄露。有没有什么情况下它会泄漏(除了我没有正确调用delete )?
谢谢。
发布于 2013-03-12 14:14:40
是,如果new抛出构造函数,这是可能的。
析构函数将不会运行,任何已经发生的分配都不会被释放。
更具体地说:如果在构造函数中发生异常之前动态分配了任何内存,则会发生内存泄漏,因为对象的析构函数将不会运行。
一个简单的插图:
class Leaks
{
private:
data* d;
public:
Leaks()
{
data = new int;
throw 1;
}
~Leaks()
{
delete data;
}
};这是一个有缺陷的设计。data总是会在这里泄露。这事一点儿办法都没有。(唯一不会泄漏数据的情况是new失败。)
因为new本身可以抛出,所以您的示例代码能够在一个或多个分配后抛出,从而导致泄漏。
有三种方法可以解决这个问题:
中,除了最微不足道的部分之外,所有代码都是如此
发布于 2013-03-12 14:14:23
没有泄漏。这段代码很好--没有泄漏。
发布于 2013-03-12 14:15:17
看不到任何泄漏或潜在的泄漏。唯一令人讨厌的地方是硬编码的数组大小。如果要将其更改为动态的,则可能需要查看delete[]操作符。
https://stackoverflow.com/questions/15354502
复制相似问题