【问题标题】:Valgrind memory leakValgrind 内存泄漏
【发布时间】:2013-06-24 15:12:19
【问题描述】:
Record* MyClass::get_record (int id)
{
    Record* rec = new Record();
    Record* compressed_rec;

    /* ... code that gets compressed_rec into memory ... */

    compressed_rec->decompress(rec);

    return rec;
}

这个函数总是这样使用的:

Record* rec = my_class_instance.get_record (id);
show_contents_of(rec);
delete rec;

valgrind 说我在第一行 (Record* rec = new Record();) 泄漏了内存。为什么?

【问题讨论】:

  • 被截断的代码是什么?
  • 要么是误报,要么泄漏在其他地方。
  • 关于内存泄漏,我相信 valgrind,并说您有一个不会删除内存的代码路径(例如通过异常)。由于缺少这么多代码,我们只能猜测。并想知道为什么不使用智能指针,这可能会解决问题......
  • @hmjd,我编辑了帖子。
  • hm 你的compressed_rec 指针怎么了?它是否在某处被释放:-)?

标签: c++ memory-leaks valgrind


【解决方案1】:

valgrind 说我在第一行泄漏了内存 (Record* rec = new Record();)。为什么?

它是否表明Record 本身被泄露,或者在Record::Record 内部分配了其他东西?

如果是前者,要么来自MyClass::get_record 的某些返回路径泄漏它,要么调用者 泄漏它。切换到使用智能指针可以解决这两种情况:

std::unique_ptr<Record> MyClass::get_record (int id)
{
    std::unique_ptr<Record> rec(new Record());
    ...
    return rec;
}

如果是后一种情况,要么意味着整个 Record 被泄露(见上文),要么它的析构函数有问题。再次尝试将所有动态分配的成员保存在智能指针中。

【讨论】:

    猜你喜欢
    • 2020-03-31
    • 2016-03-15
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    相关资源
    最近更新 更多