我需要清理鏈接對象的動態內存。我正在研究優化問題的分支&界限算法。我有一個名爲「節點」的類保存部分解決方案的數據。我使用「新」功能創建節點。所有創建的節點相互鏈接形成一個鏈,就像我創建了一個manuel list。每個節點都知道它後面最好的節點的物理地址。這條鏈是動態的。使用現有節點,我會生成新節點並將其鏈接到鏈中,直到找到最佳解決方案。對於某些問題,當節點數量約爲30億(30-40 GB)時,我會找到最佳解決方案。我將代碼設置爲在解決下一個問題時解決問題(我在過程中通過多個文件流來完成此任務)。爲了解決另一個問題,我需要釋放內存。當我找到最優的時候,以及當我不再需要節點鏈時,我試圖使用「刪除」功能。壞消息是刪除30億個互相鏈接的節點對象需要數小時。我正在終止該程序,從目錄中刪除已解決的文件,等待Windows釋放內存然後重新啓動以繼續工作。 有沒有辦法釋放內存,同時傳遞到另一個問題來解決終止過程所執行的清理操作,還是應該更改節點鏈的結構?清理鏈接對象的動態內存
回答
使用析構函數釋放由構造函數分配的資源,或者由mutators分配的其他資源。
聽起來像一個自定義的新作業,可以從池中分配,您可以取消分配。
class Node
{
void* operator new(size_t bytes);
void delete(void* ptr) {}
...
};
現在,當你做到了,可以叫delete[] big_block;
和所有的內存被釋放您的運營商新的能做到這一點
char* big_block = new char[100000];
char* free_ptr = big_block;
void* Node::operator new(size_t bytes)
{
char* ptr = free_ptr;
free_ptr += bytes;
return ptr;
}
然後。反正就是這樣。有一些細節需要補充。
不應該是void * Node :: operator new(size_t bytes)? 您還忘記了在刪除之前添加操作員。 – 2013-03-18 13:23:11
@ErgoProxy,是固定的 – john 2013-03-18 14:00:07
如果您有30億個對象,則需要釋放30億個對象。除非你欺騙。
作弊的一種方式是殺死進程,正如您已經正確指出的那樣。當然這排除了之後做其他事情。
另一種方法是過載operator new
使用塊分配器和operator delete
什麼都不做(或忘記operator delete
全部)。塊分配器會分配一個巨大的塊(或者可能需要幾個塊,這些塊可能位於鏈表中),從中分配的對象正在被繪製。這可以用相對簡單的方式實現(從數組中返回一個元素,然後遞增索引)。
然後,當您完成30億個對象時,調用塊分配器中的函數,該函數一次只拋出整個塊(釋放它們)。分配器不知道30億個對象,並不在乎。它所做的只是一次(或者可能是3-4次)大量釋放。
- 1. 動態鏈接smalltalk對象
- 2. 如何動態鏈接GCC對象?
- 3. 內存管理與靜態對象
- 4. 對象的動態內存分配
- 5. 用動態內存返回對象
- 6. 動態PHP表內動態鏈接
- 7. JS動態內容鏈接
- 8. 清理IndexedDB的對象存儲
- 9. 哪個STL對象或內存管理用於動態實體
- 10. QList清除函數調用是否清除存儲在QList中的動態分配對象的內存?
- 11. OSGi內存清理
- 12. C#內存/對象理解
- 13. 未管理對象的內存管理
- 14. COM對象清理
- 15. 清理@RequestScoped對象?
- 16. COM對象清理
- 17. 閱讀json對象清理和數據庫存儲清理
- 18. 在javascript中清除對象內存
- 19. Python 2.6似乎GC清理對象,但內存不釋放
- 20. 如何清除動態內存?
- 21. 解釋緩存內存和內存管理的鏈接
- 22. ProxyHTMLURLMap用於JSON對象內的鏈接
- 23. 自動清理非託管內存
- 24. 動態鏈接庫的工作原理
- 25. 允許鏈接的JavaScript動態內容
- 26. 清理舊的Realm對象?
- 27. 存儲動態QML對象
- 28. 內存中對象之間的FHIR資源鏈接
- 29. 鏈接共享對象與靜態庫
- 30. Java +鏈接列表+多態對象
如果他使用delete,析構函數會自動調用。他的觀點是,這個過程對於他的申請來說太長了。 – Syjin 2013-03-18 13:09:21