當我在對象上使用delete
關鍵字時,是否執行了對象析構函數?如果我刪除的對象包含其他指針並且我不刪除它們,那是內存泄漏嗎?在被刪除的對象內動態分配對象會發生什麼?
我有時會在使用delete
時感到困惑。當我傳遞信息時,問題對我來說是最糟糕的。我不知道何時可以安全地使用delete
,因爲害怕消除從別處指向的對象。
當我在對象上使用delete
關鍵字時,是否執行了對象析構函數?如果我刪除的對象包含其他指針並且我不刪除它們,那是內存泄漏嗎?在被刪除的對象內動態分配對象會發生什麼?
我有時會在使用delete
時感到困惑。當我傳遞信息時,問題對我來說是最糟糕的。我不知道何時可以安全地使用delete
,因爲害怕消除從別處指向的對象。
當我使用delete關鍵字的對象上的對象的析構函數執行?
是的。這就是析構函數的用途。
如果被刪除的對象包含其他指針而我不刪除它們,那是內存泄漏嗎?
是的。這是最常見的內存泄漏源之一。
我不知道什麼時候可以安全地使用delete,因爲害怕消除從別處指向的對象。
這是一個難題。沒有完美解決問題的系統,但通過使用引用計數智能指針並減少共享對象的數量,您可以獲得相當大的回報。
這是一個內存泄漏。這是一個非常普遍的問題。當你刪除一個你用來分配內存的對象時,它會調用這個對象的析構函數。析構函數是您應該提供實現來清理(刪除)該對象生命期內可能分配的所有內存的位置。
如果使用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的的公共引用計數爲零它會做刪除你。
當我在 對象上使用delete關鍵字時,是否執行了對象析構函數 ?
是
什麼,如果我反對刪除 包含其他指針,我不 刪除它們,是內存泄漏?
是的,除非其他人也有一個指針,並且其他人負責刪除它們。由於雙刪除,您也可能有問題。如果你刪除了一個給你的指針,但是別人有一個指向那個內存的指針,那麼他的指針現在就沒有指向任何東西。當他使用該指針時,他的程序可能會崩潰。
我不知道什麼時候是安全的使用 刪除恐懼消除被指向從 其他地方的 的對象。
你不是唯一一個。在您的代碼部分之間建立關於誰擁有什麼的協議和約定很重要。什麼是「生產」對象。什麼是「消費」他們。您也可能希望使用諸如boost :: shared_ptr和boost :: weak_ptr之類的工具來進行引用計數。
是的,這是一個泄漏。查看Freestore management常見問題解答是否可以爲您增加一些洞察力。
當您撥打刪除someObect;發生這樣的事情:
if(someObect != NULL)
{
someObect->~ClassName();// you did ClassName someObect = new ClassName();
operator delete(someObect);
}
而且delete操作符做我的理解同樣的事情,那免費做 - 它釋放(解除分配)的內存。但請記住,如果您使用新您不能使用免費,您必須使用刪除並且只有它。
這不是'delete'關鍵字的問題,而是每個對象破壞的問題。如果你離開了這個範圍,那麼你的對象被分配到了堆上,那麼析構函數將被調用,並且你引用的指針將會丟失,如果你已經用'new'創建並且用'delete'銷燬的話。 – lvella 2011-04-16 02:32:53