2014-09-22 76 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

相關問題