代码之家  ›  专栏  ›  技术社区  ›  Sayan

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

  •  2
  • Sayan  · 技术社区  · 8 年前

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

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

    #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;
    }
    

    unique_ptr ,只需使用 bv.emplace_back(new Derived); delete 指针明确来自向量。是什么导致了泄漏?

    1 回复  |  直到 8 年前
        1
  •  5
  •   Sergei    8 年前

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

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

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

    包括iostream

    更多详细信息: Valgrind: Memory still reachable with trivial program using <iostream>

    推荐文章