gpt4 book ai didi

c++ - 将指针存储到 vector 时发生内存泄漏

转载 作者:搜寻专家 更新时间:2023-10-31 00:28:23 28 4
gpt4 key购买 nike

我已经阅读了多个关于同一主题的类似问题,但我无法通过关注这些问题来解决我的问题。

我想在 vector 中存储指针,但我看到内存泄漏。我的代码如下。

#include <iostream>
#include <vector>
#include <memory>

class Base
{
public:
virtual ~Base() {}
};

class Derived : public Base {};

std::vector<std::unique_ptr<Base>> bv;

int main()
{
for (int i = 0; i < 10; i++)
bv.emplace_back(std::make_unique<Base>(Derived()));

bv.clear();

return 0;
}

Valgrind 报告:“仍可访问:1 个 block 中的 72,704 字节”。如果我不使用 unique_ptr,而只使用 bv.emplace_back(new Derived);,并且 delete 指针,我会遇到同样的问题明确地从 vector 。是什么导致泄漏?

最佳答案

看起来您实际上存储了基类的实例。 Derived() 在堆栈上创建一个对象,然后 make_unique 将它传递给 Base 的构造函数。这是对象切片。这并不能解释泄漏,但表明代码可能无法达到您的预期。

补充:已删除:free() 并不总是将内存返回给系统。 Libc 将为将来的 malloc() 保留此内存。这可能解释了您的观察结果。

我同意@cmaster 下面的评论。 Valgrind 确实跟踪 malloc/free。经过一番研究后,我在 stackoverflow 上发现了另一个问题,它解释了观察结果。

包含 iostream

“许多 C++ 标准库的实现都使用它们自己的内存池分配器。”他们只是不释放他们的内存。

更多详情:Valgrind: Memory still reachable with trivial program using <iostream>

关于c++ - 将指针存储到 vector 时发生内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45469295/

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