2011-04-16 72 views
1

當我在對象上使用delete關鍵字時,是否執行了對象析構函數?如果我刪除的對象包含其他指針並且我不刪除它們,那是內存泄漏嗎?在被刪除的對象內動態分配對象會發生什麼?

我有時會在使用delete時感到困惑。當我傳遞信息時,問題對我來說是最糟糕的。我不知道何時可以安全地使用delete,因爲害怕消除從別處指向的對象。

+0

這不是'delete'關鍵字的問題,而是每個對象破壞的問題。如果你離開了這個範圍,那麼你的對象被分配到了堆上,那麼析構函數將被調用,並且你引用的指針將會丟失,如果你已經用'new'創建並且用'delete'銷燬的話。 – lvella 2011-04-16 02:32:53

回答

3

當我使用delete關鍵字的對象上的對象的析構函數執行?

是的。這就是析構函數的用途。

如果被刪除的對象包含其他指針而我不刪除它們,那是內存泄漏嗎?

是的。這是最常見的內存泄漏源之一。

我不知道什麼時候可以安全地使用delete,因爲害怕消除從別處指向的對象。

這是一個難題。沒有完美解決問題的系統,但通過使用引用計數智能指針並減少共享對象的數量,您可以獲得相當大的回報。

0

這是一個內存泄漏。這是一個非常普遍的問題。當你刪除一個你用來分配內存的對象時,它會調用這個對象的析構函數。析構函數是您應該提供實現來清理(刪除)該對象生命期內可能分配的所有內存的位置。

0

如果使用new,則必須使用delete。這將觸發實例的析構函數被調用。如果該實例在其構造函數(或更高版本)中new'd任何對象,它應該在其析構函數中刪除它們。另外,如果你新建數組(new char [20]等),你必須在刪除時使用'delete []',否則行爲是不確定的。

可以避開很多痛苦使用的std :: TR1 :: shared_ptr的,或升壓:: shared_ptr的,它會做引用計數,併爲你做了刪除,這是不是:

Foo *pFoo = new Foo; 

std::tr1::shared_ptr<Foo> pFoo(new Foo); 

那麼你並不需要做刪除:當shared_ptr的的公共引用計數爲零它會做刪除你。

1

當我在 對象上使用delete關鍵字時,是否執行了對象析構函數 ?

什麼,如果我反對刪除 包含其他指針,我不 刪除它們,是內存泄漏?

是的,除非其他人也有一個指針,並且其他人負責刪除它們。由於雙刪除,您也可能有問題。如果你刪除了一個給你的指針,但是別人有一個指向那個內存的指針,那麼他的指針現在就沒有指向任何東西。當他使用該指針時,他的程序可能會崩潰。

我不知道什麼時候是安全的使用 刪除恐懼消除被指向從 其他地方的 的對象。

你不是唯一一個。在您的代碼部分之間建立關於誰擁有什麼的協議和約定很重要。什麼是「生產」對象。什麼是「消費」他們。您也可能希望使用諸如boost :: shared_ptr和boost :: weak_ptr之類的工具來進行引用計數。

0

當您撥打刪除someObect;發生這樣的事情:

if(someObect != NULL) 
{ 
someObect->~ClassName();// you did ClassName someObect = new ClassName(); 
operator delete(someObect); 
} 

而且delete操作符做我的理解同樣的事情,那免費做 - 它釋放(解除分配)的內存。但請記住,如果您使用您不能使用免費,您必須使用刪除並且只有它。

相關問題