2012-06-13 51 views
3

如果我不使用new來分配類的數據成員,是否還有任何清理需要在析構函數中完成?例如,在以下情況下,我需要delete這個向量嗎?還是取決於MyType我是否需要清理非指針數據成員?

class A { 
    A(); 
    ~A(); 
    MyType x; 
    std::vector<MyType> v; 
}; 
A::A() { 
    x = MyType(42); 
    v = std::vector<MyType>(5); 
} 
A::~A() { 
    // what goes here? 
} 

回答

9

要迂腐,它取決於什麼MyType是。如果你有typedef char* MyType並且你爲MyType分配了內存,並且你希望這個內存被這個對象所擁有,那麼是的,你需要一個析構函數。

否則,您不需要爲沒有分配的任何內存釋放內存,因爲它沒有與newmalloc分配,所以沒有。

你的課甚至不應該有一個析構函數。有一個普遍的共識,你應該只有一個析構函數,當你真的需要它。具有析構函數還意味着實現賦值運算符和複製構造函數(三條規則)。如果你沒有管理任何內存,最好依靠編譯器提供的內存 - 即編譯器將生成這三個如果你不這樣做。

此外,您構造應該是這樣的:

A::A() : x(42), v(5){ 
} 

否則你的成員將被初始化,然後分配到,這是一種浪費。

+0

在這種特殊情況下,不需要dtor。請記住,「RAII」中的「R」代表*資源*,而不是*記憶*。有時你需要在dtor中釋放內存以外的東西。 –

+0

@JohnDibling但是這個(至少是第二部分)是基於這樣的假設,即資源在其特定所有者被銷燬時被釋放。因此,如果'MyType'獲取資源並在其析構函數中釋放它,那就沒問題。 –

+0

是的,我更多的爲未來的讀者發表評論。 :) –

1

析構函數會自動調用,所以您不需要這樣做。此外,指針使用smart pointers(如std::unique_ptr)而不是delete手動。

class A { 
    A(); 
    ~A(); 
    MyType x; 
    std::vector<MyType> v; 
}; 
A::A() : x(42), v(5) { } 
A::~A() { 
    // x.~MyType() implicitly called. 
    // v.~std::vector<MyType>() implicitly called. 
} 
4

您的類並不需要一個明確的析構函數。無論如何,vector的析構函數將被自動調用。而且由於矢量對象本身(與內部的數據相反)不是動態的,所以你不需要delete它。事實上,這將是一個語法錯誤,因爲v不是一個指針。

+0

所以在這種情況下,「三個規則」不適用,因爲我只需要一個顯式的構造函數? – Andreas

+0

3的規則是copy ctor,dtor和overloaded =。不是其他人的。 – djechlin

+0

@djechlin:哦。這就說得通了。 – Andreas

0

不,你不需要。它們的構造函數將被隱式調用。

1

該矢量在銷燬時自動刪除。但是,如果您將指針存儲在向量中,例如如果你說矢量< Foo * > v ;,你需要編寫代碼來刪除向量中的指針。爲了避免這種情況的一個方法是使用矢量<的std ::的unique_ptr <富> >或載體<的std :: shared_ptr的<富> >

0

對於A類沒有,你不這樣做,因爲它不有任何指針成員分配使用malloc

要注意的是,如果你的類/結構的MyType有任何指針作爲成員,的MyType的析構函數是釋放這種指針的內存責任,但你不必與在課堂上的後顧之憂A,因爲當它的析構函數被調用時,向量的析構函數調用的析構函數MyType

+0

除非'MyType'是一個指針,在這種情況下不會調用析構函數,並且會泄漏內存。 –

+0

@LuchianGrigore是不是正確的,'MyType'只能是一個指針,如果它已經'typedef'fed? – Andreas

+0

@Andreas或用定義'#定義MyType的X *':) –

相關問題