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];
}
}
Run Code Online (Sandbox Code Playgroud)
我只是好奇上面的代码是否会自行泄露.是否有任何可能泄漏的情况(除非我没有正确地调用删除)?
谢谢.
是的,如果new在构造函数中抛出则可能.
然后不会运行析构函数,并且不会释放已经发生的任何分配.
更具体一点:如果在构造函数中发生异常之前动态分配了任何内存,则会发生内存泄漏,因为该对象的析构函数不会运行.
一个简单的例子:
class Leaks
{
private:
data* d;
public:
Leaks()
{
data = new int;
throw 1;
}
~Leaks()
{
delete data;
}
};
Run Code Online (Sandbox Code Playgroud)
这是一个有缺陷的设计.data总会在这里泄漏.你无能为力.(如果new失败,数据不会泄漏的唯一情况就是.)
由于new它本身可以抛出,因此您的示例代码能够在一次或多次分配后抛出,从而使您无法进行泄漏.
有三种方法可以解决这个问题:
| 归档时间: |
|
| 查看次数: |
79 次 |
| 最近记录: |