2012-02-28 340 views
12

我的問題很簡單,但我一直無法在任何地方找到問題。析構函數是否自動調用

如果我有一個像這樣的

class A { 
    vector<int> data; 
} 

A一個實例被破壞將data也得到妥善銷燬一類,或者我應該寫析構函數A調用data的析構函數?基本上我擔心當A的實例被破壞時,vector的動態內存是不會被釋放的。我懷疑答案是,data被正確釋放,但我不想弄清楚我是錯的。

此外,如果A是一個結構,當A的本地實例超出範圍時,將調用data的析構函數嗎?

+2

在「class A」聲明之後,你沒有分號(這不是真的聲明,因爲它缺少......哦)。 – 2012-02-28 18:40:20

回答

14

是的,data會自動銷燬,你不需要做任何事情來實現它。 vector將處理清理由其分配的動態內存。當A的實例被銷燬時,矢量的析構函數會自動調用。

無論Aclass還是struct,行爲都沒有差異。

+14

+1爲了清楚起見,「vector將處理清除由* it分配*的動態內存,而不是* to * it。如果您將動態分配的對象存儲在向量中,則您有責任相應地刪除它們。 – netcoder 2012-02-28 18:34:32

+0

@netcoder發現你的評論有點誤導。你可以在vector中存儲指向動態分配對象的指針**,但我不認爲你可以存儲在vector中動態分配的「objects」。如果你聲明一個矢量其中ClassA是一個類名,那麼vector將負責銷燬它所持有的ClassA對象。當然,如果你的ClassA對象持有指向其他對象的指針,那麼它是** ClassA的責任,刪除它們**,**不是vector **的責任,但這是另一回事。 – 2016-11-28 22:45:32

2

沒有必要,數據成員的析構函數總是被調用。

一個明確的析構函數是很有用的手動內存管理

struct a{ 
    int* ip; 
    a() 
    : ip(new int(5)) 
    { } 

    ~a() { delete ip; } 
}; 

這就是說,你應該一般來說使用RAII容器(如智能指針),所以我個人很少寫dtors有天。

而例外情況是聲明基類dtor爲虛擬。

struct base { 
    virtual ~base() {} 
}; 
struct child : public base { 
    //base and child destructor automatically called 
} 
+0

+1遵守良好的RAII原則。當人們用Stroustrup,Sutter,Meyers和其他現代C++思想家的方式編寫C++時,手動編寫析構函數的需求應該越來越少。 – stinky472 2012-02-28 19:06:05

1

如果您自己沒有定義默認析構函數,編譯器會自動創建一個默認析構函數。一般來說,除非指針數據成員擁有指向它的內存的成員,並且/或者您正在設計您的類別由其他類別派生,那麼您不需要創建自己的析構函數,此時您需要至少要聲明一個空的virtual析構函數。

在任何情況下,無論是使用自己的析構函數,還是使用默認的編譯器創建的析構函數,非靜態數據成員的所有析構函數以及當前類的任何基類都會在析構函數和析構函數本身返回之前。