2016-04-17 179 views
0

讓我們考慮以下情形在單鏈表: -釋放內存forcelly

我一直在考慮的目標節點,這將被刪除。

讓我們假設以下數據,我將接收持有「3」的對象,這是我要刪除的對象;

1 - > 2 - > 3 - > 4 - > 5 - > 6

和類結構是: -

Class DataHolder 
{ 
int data; 
DataHolder nxtPrt; 
} 

Void Delete (DataHolder currentData) 
{ 

currentData.data = currentData.nxtPrt.data; //Now 3 will be overwritten by 4 
(x) currentData.nxtPrt = (y) currentData.nxtPrt.nxtPrt; 

//Now the object which belongs to 4 (previously it was 3), 
//is pointing to 5; 

} 

所以,現在的對象4的實際拷貝現在成爲無用;

所以,現在我只想刪除分配給4的原始副本的空間;

但是,現在我無法跟蹤,也因爲,我已經改變了目標指向5

所以現在,在這一點上我已經失去了實際的對象4.

我可以請知道,有沒有辦法強制要求對象釋放其佔用的內存,如使用dealloc在「C」中執行,或者我必須依靠GC來收集未使用的空間。

在此先感謝。

+1

你永遠不應該做的幾件事。不要強制垃圾收集,不要編寫自己的LinkedList類,也不要使用鏈表。教育你自己,從你當地的圖書館查看關於.NET編程的介紹性書籍,以避免觸及每一個不好的習慣。 –

+2

@ThomasAndreèLian:'IDisposable'對確定性地釋放文件句柄,套接字等無用資源非常有用。託管內存由垃圾收集器處理,與「IDisposable」無關。處理一些東西不會釋放任何託管內存。 –

回答

2

你總是依賴GC,這是無法解決的。是的,只要沒有提及它們,它就會清理你的其他物體。您可以分配非託管內存並按照您認爲合適的方式進行處理,但在這種情況下,您爲什麼使用C#?只需使用C(++)。

但最簡單的答案是不要寫自己的鏈表。只需使用LinkedList<YourStruct>。瞭解您的環境 - 語言,庫和運行時。如果你只是想用C#編寫C代碼,那麼你將會受到傷害,沒有人會理解你的代碼,你從C#工作中幾乎沒有任何好處。再一次,如果你不想使用C#/ .NET ......不要。 C或C++或非託管語言本身沒有錯誤。使用最好的工具來完成這項工作。

不要用C語言來思考。它在GC'd /託管環境中不起作用。當你在C中分配內存時,內存來自哪裏?通常是堆棧或堆,在寄存器中有幾位。在.NET中,這是抽象出來的,但實際上,你仍然只有這三個位置。但是,他們的工作方式不同你不能在堆棧上分配類或數組(對於使用不安全代碼的支持有限,但就是這樣)。有多個堆,除了大對象堆外,他們總是從頂端分配,類似於堆棧。因此,取消分配單個對象沒有任何價值 - 如果您不需要使用compact堆來消除空閒區域,則不會減少內存使用量,並且不會爲新對象獲得任何額外空間。

+0

同意..問題進一步複雜的OP使用裝飾者模式的1維列表 –

+0

@ S.W。這不是一個真正的裝飾模式。這只是在C - 記錄和函數中完成的方式:) – Luaan