MS Stl库是否包含内存泄漏?

时间:2012-01-12 14:36:34

标签: c++ memory

我遇到了网页(不记得在哪里),说明MS c ++ stl容器的clear() API中存在内存泄漏。

因此,如果您有:

void main()
{ 
   std::vector<int> vVec;
   for(int i =0; i < 100; i++)
      vVec.push_back(i);

   vVec.clear();
}

因此,堆上为向量分配的内存并未真正释放......

该说明(据我记得)以下技术确保内存真正发布......

void main()
{ 
   std::vector<int> vVec;
   for(int i =0; i < 100; i++)
      vVec.push_back(i);

   vVec.clear();
   vector<int>(vVec).swap(vVec);
}

你有这方面的经验吗?以上是真的吗?如果是的话,这里到底发生了什么?

(最后一个问题,对不起,这对所有其他stl容器都是如此吗?) 谢谢,

2 个答案:

答案 0 :(得分:6)

这不是内存泄漏;这是所要求的行为(按标准)。 std::vector<>::clear()不允许降低容量,因此 无法释放其缓冲区。内存释放时 调用析构函数,在swap中,缓冲区将被交换,所以在

vector<int>().swap(vVec);

,临时对象给它(空)缓冲区vVec,并接收 vVec的非空缓冲区,它在完整的末尾删除 表达

clear之后通常不需要,甚至不需要。如果你想 一个全新的向量,只需声明一个。另一方面,如果你已经 逐渐填充矢量,它可以很容易地具有更多的容量 比需要的,以及一个过大的缓冲区。在这种情况下:

vector<int>(vVec).swap(vVec);

首先会使用精确大小的缓冲区制作(临时)副本 与vVec交换缓冲区。结果将是vVec有一个 容量等于它的大小,而不是更多。 (形式上,这不是 由标准保证在任何地方,但在实践中,它对应于 我所知道的所有实现。)

答案 1 :(得分:1)

允许

std::vector<>分配比所需内存更多的内存(这是为了能够以分摊的常量时间附加元素)。

clear()没有义务(事实上,不允许)释放为元素分配的内存。

但是,我不会将上述行为调用内存泄漏,因为当向量超出范围时内存将被正确释放。