这个具体的例子会产生内存泄漏吗?

Lem*_*ons 1 c++

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)

我只是好奇上面的代码是否会自行泄露.是否有任何可能泄漏的情况(除非我没有正确地调用删除)?

谢谢.

Cor*_*bin 9

是的,如果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它本身可以抛出,因此您的示例代码能够在一次或多次分配后抛出,从而使您无法进行泄漏.

有三种方法可以解决这个问题:

  • 不要分配内存(在这种情况下你只需要使用一个向量,但显然有时候无法使用动态分配)
  • 确保你的构造函数在任何内存分配之后永远不会抛出,或者如果在抛出之前它会抛出内存来清理内存.除了最琐碎的构造函数之外,这将会产生一些非常讨厌的代码
  • 使用智能指针