将指针存储到向量时内存泄漏

时间:2017-08-02 19:20:02

标签: c++ vector valgrind smart-pointers unique-ptr

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

我想将指针存储在向量中,但是我看到了内存泄漏。我的代码如下。

#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报告:&#34;仍然可以访问:1个块中的72,704个字节&#34;。如果我不使用unique_ptr,并且只使用bv.emplace_back(new Derived);delete来自向量的指针,我会遇到同样的问题。什么导致泄漏?

1 个答案:

答案 0 :(得分:5)

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

此外: DELETED:free()并不总是将内存返回给系统。 Libc将为未来的malloc()保留这个内存。这可能解释了你的观察结果。

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

包括iostream

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

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