c++ - 将指针存储到 vector 中时出现内存泄漏

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

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

我想将指针存储在 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);,并删除指针,我也会遇到同样的问题明确地从 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/

相关文章:

android - 加速 ImageView 中的缩放功能

c++ - Vector2 运算符改进

c++ - 为什么我能够在没有 std::qualifier 的情况下调用这个 C++ 标准库函数?

c - 避免 GLib 内存池和 Valgrind 可能在 C 中丢失

c++ - 抑制 GTK+ 中的 Valgrind 错误

c++ - 如何在 Linux 上的 C++ 中关闭文件时删除文件?

java - 创建占用特定数量 CPU 和 RAM 的任务

c++ - Qt套接字写段错误

c++ - 从 int 到 vector 的隐式转换?

Valgrind 未处理的指令字节错误