簡體   English   中英

內存泄漏問題; 刪除指針

[英]Memory leak issue; deleting a pointer

如果我有一個指針指向堆上的特定內存地址。 我想這個相同的指針指向另一個內存地址,我應該先delete指針? 但是,在這種情況下,我實際上是刪除指針還是只是破壞指針指向的引用(內存地址)?

所以,換句話說,如果我delete一個指針,這是否意味着它不再存在? 或者,它在那里,但沒有指出它在哪里?

delete的語法有點誤導。 當你寫作

T* ptr = /* ... */
delete ptr;

沒有刪除變量ptr 相反,您正在刪除ptr指向的對象。 ptr的值沒有變化,它仍然指向以前的位置,所以你應該確保在沒有重新分配它的情況下不要取消引用它。

在重新分配之前,不要求delete指針。 但是,如果要以一種導致丟失對指向對象的最后一個引用的方式重新分配指針,則應該確保(例如,如果此指針是程序中指向其指針的唯一指針),然后你應該delete它,以確保你不泄漏內存。

許多C ++程序員用來簡化何時釋放內存的邏輯的一種技術是使用智能指針 ,重載模擬指針所需的運算符的對象以及具有自動執行的自定義代碼以幫助跟蹤資源的對象。 例如,新的C ++ 0x標准將為此提供shared_ptrunique_ptr類型。 shared_ptr就像一個常規指針,除了它跟蹤資源有多少shared_ptr 當資源的最后一個shared_ptr改變它所指向的位置時(通過重新分配或被銷毀),它隨后釋放資源。 例如:

{
    shared_ptr<int> myPtr(new int);
    *myPtr = 137;
    {
       shared_ptr<int> myOtherPtr = myPtr;
       *myPtr = 42;
    }
}

請注意,此代碼中沒有任何地方調用delete來匹配對new的調用! 這是因為shared_ptr足夠智能,可以在最后一個指針停止指向資源時注意到。

使用智能指針時需要注意一些特性,但它們值得花時間投資來學習。 一旦了解了它們的工作原理,就可以編寫更清晰的代碼。

delete指針時, 釋放分配給指向對象的內存。 所以,如果你只是想你的指針指向一個新的存儲位置,你應該delete的指針。 但是如果你想要銷毀它指向的對象,然后指向另一個對象,那么你應該delete指針。

xtofl,雖然有趣,但有點正確。

如果你'新'是一個內存地址,那么你應該刪除它,否則不管它。 也許你正在考慮太多,但你想到這樣。 是的,記憶總是在那里,但是如果你在它周圍放一個柵欄,你需要把柵欄放下來,或者沒有其他人可以。

當你調用delete你將指針指向的內存標記為空閑 - 堆獲取它的所有權並可以重用它,就是這樣, 指針本身通常不變

如何處理指針取決於你想要什么。 如果您不再需要該內存塊 - 請使用delete來釋放該塊。 如果您以后需要它 - 將地址存儲在稍后可以檢索它的地方。

簡而言之,您不“刪除指針”,刪除指針指向的任何內容。

這是一個經典問題:如果刪除它,而其他人指向它,它們將讀取垃圾(並且很可能會使應用程序崩潰)。 另一方面,如果你不這樣,這是最后一個指針,你的應用程序將泄漏內存。

另外,指針可以指向最初未由“new”分配的事物,例如靜態變量,堆棧上的對象或另一個對象的中間。 在所有這些情況下,您不能刪除指針指向的任何內容。

通常,在設計應用程序時,您(是的,您)必須決定應用程序的哪個部分擁有特定對象。 只有它,它應該在完成對象時刪除它們。

要直接回答您的問題,之前已經提出過這個問題。 delete將刪除指針指向的內容,但Bjarne Stroustrup建議不再依賴指針本身的值,特別是如果它是l值。 但是,這不會影響重新分配它的能力,因此這將是有效的:

for( p = first; p != last; ++p )
{
   delete p;
}

如果你正在迭代一個指針數組,所有指針都已經分配了new

C ++中的內存管理最好使用稱為RAII的技術,“資源獲取是初始化”。

這實際上意味着,在您分配資源時,您會立即處理它的生命周期,即您通過將其置於某個對象中來“管理”它,當它不再需要時將為您刪除它。

shared_ptr是一種常用的技術,資源將在許多地方使用,你不確定哪個是最后一個“釋放”它,即不再需要它。

shared_ptr通常僅在其他地方用於其語義,即您可以輕松地復制和分配它們。

還有其他內存管理智能指針,特別是std :: auto_ptr,它將被unique_ptr取代,並且還有scoped_ptr。 weak_ptr是一種能夠獲得shared_ptr的方法,如果一個存在於某個地方,但不能自己持有一個引用。 你調用“lock()”,它給你一個shared_ptr到內存或一個NULL,如果所有當前的共享指針已經消失。

對於數組,您通常不會使用智能指針,只需使用向量。

對於字符串,通常使用字符串類而不是將其視為char的向量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM