2011-05-13 42 views

回答

6

如果你刪除一個對象,該對象的析構函數將被調用,所以你需要在析構函數中做一個刪除操作。所以請記住,類在堆上分配的所有內容都必須在析構函數中釋放。如果它被分配在堆棧上自動發生這種情況

struct A 
{ 
    A() { std::cout << "A()" << std::endl; ptr = new char[10]; } 
    ~A() { std::cout << "~A()" << std::endl; delete []ptr; } 
    char *ptr; 
}; 

但要小心,如果你使用的是繼承,如果從基類A繼承,你需要做的基礎析構函數虛擬的,或者在析構函數A將不會被調用,您將有內存泄漏。

struct Base 
{ 
    virtual ~Base() {} 
}; 

struct A : public Base 
{ 
    A() { std::cout << "A()" << std::endl; ptr = new char[10]; } 
    ~A() { std::cout << "~A()" << std::endl; delete []ptr; } 
    char *ptr; 
}; 
3

他們會卡在內存中。因此,當您在對象內進行動態內存分配時,您需要定義析構函數。當父對象即將被刪除時,D'tor被調用,並且你應該明確地釋放所有的子分配內存。請致電Wikipedia

+3

而當你定義一個析構函數時,你應該定義一個複製構造函數和一個複製賦值運算符。 [見這裏](http://stackoverflow.com/questions/4172722/)。 – 2011-05-13 09:19:58

+1

@Space:錯誤...三規則不包括* constructor *:[見維基](http://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)) – Nawaz 2011-05-13 09:21:09

+0

@Nawaz:謝謝。這是一個錯字。現在好多了? – 2011-05-13 09:23:44

1

是的,你會在類的析構函數中清理內存。

1

顯式指針必須是delete(由您或某個庫包裝器)。例如;

struct A { 
    char *p; // assume p = new char[] somewhere; 
}; 

A* pA = new A; 
delete pA; // <-- this doesn't clean up char* p 
1

如果您在Deconstructer中專門告訴它,對象只會清除指針。

1

如果一個類被正確寫入,刪除該類的一個實例應該釋放該類所分配的所有資源。

如果類存儲指向內存的指針而不是分配,除非文檔另有規定,否則通常不會刪除這些指針。