這只是個空想閱讀本等問題時,我有:在C++中刪除類或結構時會刪除多少?
What is the correct way to delete char**
如果已物體內部創建在問題中提到的字符和該對象被刪除,是否會正確地清理指針也好,還是會卡在內存中?
這只是個空想閱讀本等問題時,我有:在C++中刪除類或結構時會刪除多少?
What is the correct way to delete char**
如果已物體內部創建在問題中提到的字符和該對象被刪除,是否會正確地清理指針也好,還是會卡在內存中?
如果你刪除一個對象,該對象的析構函數將被調用,所以你需要在析構函數中做一個刪除操作。所以請記住,類在堆上分配的所有內容都必須在析構函數中釋放。如果它被分配在堆棧上自動發生這種情況
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;
};
他們會卡在內存中。因此,當您在對象內進行動態內存分配時,您需要定義析構函數。當父對象即將被刪除時,D'tor被調用,並且你應該明確地釋放所有的子分配內存。請致電Wikipedia。
是的,你會在類的析構函數中清理內存。
顯式指針必須是delete
(由您或某個庫包裝器)。例如;
struct A {
char *p; // assume p = new char[] somewhere;
};
A* pA = new A;
delete pA; // <-- this doesn't clean up char* p
如果您在Deconstructer中專門告訴它,對象只會清除指針。
如果一個類被正確寫入,刪除該類的一個實例應該釋放該類所分配的所有資源。
如果類存儲指向內存的指針而不是分配,除非文檔另有規定,否則通常不會刪除這些指針。
而當你定義一個析構函數時,你應該定義一個複製構造函數和一個複製賦值運算符。 [見這裏](http://stackoverflow.com/questions/4172722/)。 – 2011-05-13 09:19:58
@Space:錯誤...三規則不包括* constructor *:[見維基](http://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)) – Nawaz 2011-05-13 09:21:09
@Nawaz:謝謝。這是一個錯字。現在好多了? – 2011-05-13 09:23:44