2013-03-18 100 views
1

我需要清理鏈接對象的動態內存。我正在研究優化問題的分支&界限算法。我有一個名爲「節點」的類保存部分解決方案的數據。我使用「新」功能創建節點。所有創建的節點相互鏈接形成一個鏈,就像我創建了一個manuel list。每個節點都知道它後面最好的節點的物理地址。這條鏈是動態的。使用現有節點,我會生成新節點並將其鏈接到鏈中,直到找到最佳解決方案。對於某些問題,當節點數量約爲30億(30-40 GB)時,我會找到最佳解決方案。我將代碼設置爲在解決下一個問題時解決問題(我在過程中通過多個文件流來完成此任務)。爲了解決另一個問題,我需要釋放內存。當我找到最優的時候,以及當我不再需要節點鏈時,我試圖使用「刪除」功能。壞消息是刪除30億個互相鏈接的節點對象需要數小時。我正在終止該程序,從目錄中刪除已解決的文件,等待Windows釋放內存然後重新啓動以繼續工作。 有沒有辦法釋放內存,同時傳遞到另一個問題來解決終止過程所執行的清理操作,還是應該更改節點鏈的結構?清理鏈接對象的動態內存

回答

0

使用析構函數釋放由構造函數分配的資源,或者由mutators分配的其他資源。

+1

如果他使用delete,析構函數會自動調用。他的觀點是,這個過程對於他的申請來說太長了。 – Syjin 2013-03-18 13:09:21

3

聽起來像一個自定義的新作業,可以從池中分配,您可以取消分配。

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; 
} 

然後。反正就是這樣。有一些細節需要補充。

+0

不應該是void * Node :: operator new(size_t bytes)? 您還忘記了在刪除之前添加操作員。 – 2013-03-18 13:23:11

+0

@ErgoProxy,是固定的 – john 2013-03-18 14:00:07

2

如果您有30億個對象,則需要釋放30億個對象。除非你欺騙。

作弊的一種方式是殺死進程,正如您已經正確指出的那樣。當然這排除了之後做其他事情。

另一種方法是過載operator new使用塊分配器和operator delete什麼都不做(或忘記operator delete全部)。塊分配器會分配一個巨大的塊(或者可能需要幾個塊,這些塊可能位於鏈表中),從中分配的對象正在被繪製。這可以用相對簡單的方式實現(從數組中返回一個元素,然後遞增索引)。

然後,當您完成30億個對象時,調用塊分配器中的函數,該函數一次只拋出整個塊(釋放它們)。分配器不知道30億個對象,並不在乎。它所做的只是一次(或者可能是3-4次)大量釋放。