我已经阅读了多个关于同一主题的类似问题,但我无法通过遵循它们来解决我的问题。
我想在矢量中存储指针,但我看到内存泄漏。我的代码如下。
#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 报告说:"仍然可以访问:72,704 个块中的 1 个字节"。如果我不使用unique_ptr
,而只使用bv.emplace_back(new Derived);
,并从向量显式delete
指针,我也有同样的问题。导致泄漏的原因是什么?
看起来您实际上存储了基类的实例。 Derived(( 在堆栈上创建一个对象,然后make_unique将其传递给 Base 的构造函数。这就是对象切片。 这不会解释泄漏,但表明代码可能无法满足您的预期。
加法: 已删除:free(( 并不总是将内存返回系统。libc 将保留此内存以备将来使用 malloc((。这可能解释了你的观察。
我同意@cmaster下面的评论。Valgrind确实跟踪malloc/free。经过一番研究,我发现了另一个关于堆栈溢出的问题,它解释了这一观察结果。
包括 IOSTREAM
"C++标准库的许多实现都使用自己的内存池分配器。他们只是不释放他们的记忆。
更多详细信息:Valgrind:使用