加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:39:44 所属栏目:百科 来源:网络整理
导读:我遇到了一个说明MS c stl容器在clear()API中有内存泄漏的说明(不记得在哪里). 因此,如果您有: void main(){ std::vectorint vVec; for(int i =0; i 100; i++) vVec.push_back(i); vVec.clear();} 因此,在向量堆上分配的内存并未真正释放… 该笔记说(据我所
我遇到了一个说明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容器都是如此吗?)
谢谢,

解决方法

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

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

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读