2014-09-22 73 views
2

如果我在构造函数中使用new分配一些内存,如果在分配内存窗体构造函数后抛出异常,内存是否会被回收或内存泄漏?如果我从构造函数中抛出异常,构造函数中的释放内存会发生什么?

class A 
{ 
    public: 
     A() 
     { 
      p = new int(4); 
      throw 1; 
     } 

     ~A() 
     { 
      delete p; 
     } 

    private: 
     int *p; 
}; 
+2

如果你这样做*没有抛出异常,你认为会发生什么?你有一个没有“删除”的“新” - 这是不好的。 – 2014-09-22 19:01:53

+0

这是写入这是一个内存泄漏等待*无论抛出异常。为了解决你的问题,在构造函数的初始化程序中使用'std :: vector p;',然后'p(4)'。然后抛出你想要的。 [指针不应拥有资源](https://dl.dropboxusercontent.com/u/6101039/Modern%20C%2B%2B.pdf)。 – WhozCraig 2014-09-22 19:03:12

+0

好的约瑟夫。我添加了析构函数 – kadina 2014-09-22 19:05:10

回答

1

内存不会被回收。即使你有一个析构函数(和复制/赋值操作符),它仍然会泄漏内存。

任何完整构造的子对象将在抛出后被破坏。在这种情况下,p会被破坏,这与p指向的内存不会混淆:它们是两个完全不同的东西,内存实际上会被泄漏。

+0

谢谢马克。我认为下面是规则 – kadina 2014-09-22 19:10:49

+0

1)正在构建的对象的析构函数不会被调用。 2)包含在该对象类中的成员对象的析构函数将被称为 3)正在构造的对象的内存将被释放。 – kadina 2014-09-22 19:11:18

+0

但是在这种情况下,p也是成员变量。 – kadina 2014-09-22 19:12:34

相关问题