我正在處理一些有點奇怪的情況,但這正是我計劃創建的。這只是一種特殊的測試軟件...強制Windows釋放分配的內存
我的環境:MSVS 2012,Windows 7/8 32b/64b。
所以,首先我創建了一些內部結構/緩存/等我的應用程序使用,那麼我做這樣的事情(在這裏簡化了一下,請把它有點像僞代碼):
{
std::deque<boost::scoped_array<unsigned char>> deque;
try {
while (1) {
deque.push_back(boost::scoped_array<unsigned char>(new unsigned char[system_page_size])); // happens to be 4096 on my system
}
}
catch (std::bad_alloc& ex) { ... }
// do something here
}
我需要使用盡可能多的內存。我一次分配整個頁面(也許這很糟糕,應該爲deque/smart ptr的數據留出一些空間?)。當CRT決定不再有可能進行分配時,我會做更多的事情(根本不依賴任何內存可用性),然後退出範圍。它會觸發一連串的析構函數,所有這些數據都應該被釋放。
This works great。但是我碰巧進入這個奇怪的範圍不是一次,而是循環中的10次。它有時會工作2到3次。有時只有一次。下次我只會得到內存不足的錯誤,就是這樣。
從我的角度來看,我需要重新啓動整個過程才能真正強制釋放內存。有沒有一種方法可以在單一過程中實現這一點?
我可以考慮嘗試不同的分配器 - 也許這是CRT問題?我也玩過一些堆操作(即低碎片堆),但也沒有幫助。
你正在分割堆。這是正常的行爲 - 「窗戶」不會爲你留住記憶。你可以直接調用'VirtualAlloc'來完成這個工作。 –
好吧,我分解過程堆,但然後我試圖分配完全相同種類的塊。在這裏我沒有看到問題,因爲在第一個bad_alloc拋出後沒有額外的分配。 – Mickey