2014-02-23 81 views
4

即使在彈出qInt隊列中的所有元素之後,以下代碼仍未釋放3000個元素的內存消耗。是什麼原因 ?std ::隊列內存消耗導致內存泄漏 - C++?

std::queue<int> qInt; //Step01: Check the running memory 

for (int i=0;i<3000;i++) 
{  
    qInt.push(i); 
} 
//Step02: Check the running memory it should have been increased  

while(!qInt.empty()) 
{ 
    qInt.pop(); 
} 
//Step03: Check the running memory expecting Step01 memory but it is still the same of Step02 
+1

您是否使用任務管理器檢查內存消耗? – Borgleader

+0

@Borgleader當然是 – Carthi

+0

你永遠不知道,你可能會推3000多個項目進入該隊列。如果您希望釋放堆內存的最佳機會爲即將到來的假設做好準備,請將其與本地空閒自動交換。 – WhozCraig

回答

6

defalut std容器一旦保留它就不會釋放內存。 std ::隊列通常在std :: dequeue類型上實現,它提供了shrink_to_fit。如果您不使用C++ 11,請使用swap idiom

+0

你可以請建議一個鋸齒成語std ::隊列? – Carthi

2

如果您釋放/釋放/刪除堆內存。這並不意味着內存消耗會立即降低。內存管理庫有自己的可用內存緩存,它們在達到閾值後會釋放。

0

首先,由3000個整數使用的內存非常低,如果使用任務管理器檢查內存,則無法看到內存使用情況發生重大變化。另外,正如其他答案中所解釋的那樣,STL容器不會立即釋放。 有一個很好的forum討論STL對象和對象指針的內存分配和釋放。