2014-02-23 83 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对象和对象指针的内存分配和释放。