gpt4 book ai didi

c++ - MS STL 库是否包含内存泄漏?

转载 作者:太空狗 更新时间:2023-10-29 20:16:42 25 4
gpt4 key购买 nike

我在网上(不记得在哪里)看到一条说明,说 MS c++ STL 容器在它们的 clear() API 中有内存泄漏。

因此,如果您有:

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

vVec.clear();
}

因此在堆上为vector分配的内存并没有真正释放...

笔记说(据我所知)以下技术可确保内存真正释放...

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()不允许降低容量,因此无法释放其缓冲区。内存在调用析构函数,并在 swap 中,缓冲区将被交换,所以在

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

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

这在 clear 之后通常不需要,甚至不需要;如果你想一个全新的 vector ,只需声明一个。另一方面,如果你有逐渐填充一个 vector ,它可以很容易地拥有更多的容量超出需要,并且缓冲区过大。在这种情况下:

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

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

关于c++ - MS STL 库是否包含内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8836799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com