【问题标题】:Valgrind complains about a memory leak but I'm calling new and deleteValgrind 抱怨内存泄漏,但我正在调用 new 和 delete
【发布时间】:2013-04-28 14:35:56
【问题描述】:

我已经使用指针创建了一个数组,然后在析构函数中写了一个删除过程

class cBuffer{
  private:
    struct entry {
      uint64_t key;
      uint64_t pc;
    };
    entry *en;
  public:
    cBuffer(int a, int b, int mode)
    {
      limit = a;
      dist = b;
      md = mode;
      en = new entry[ limit ];
      for (int i=0; i<limit; i++) {
        en[i].key = 0;
        en[i].pc = 0;
      }
    };
    ~cBuffer() { delete [] en; }
    ...
   }

在另一个类中,我像这样使用 cBuffer:

class foo() {
   cBuffer *buf;
   foo()
   {
     buf = new cBuffer(gSize, oDist, Mode);
   }
};

然而,valgrind 抱怨新的操作符

==20381== 16,906,240 bytes in 32 blocks are possibly lost in loss record 11,217 of 11,221
==20381==    at 0x4A0674C: operator new[](unsigned long) (vg_replace_malloc.c:305)
==20381==    by 0x166D92F8: cBuffer::cBuffer(int, int, int) 

【问题讨论】:

  • 你没有遵守三法则。
  • 但这不太可能是内存泄漏的原因;您如何创建和销毁 cBuffer 对象?我最好的猜测是你用new cBuffer 泄漏了整个对象,而没有对应的delete
  • 您使用的是裸指针。你不应该。
  • @mahmood:我希望 valgrind 报告这两个漏洞。你是说它只报告那个?

标签: c++ memory-leaks valgrind


【解决方案1】:
 cBuffer *buf;
   foo()
   {
     buf = new cBuffer(gSize, oDist, Mode);
   }

你需要打电话

delete buf;

既然你明确地调用了new

【讨论】:

    【解决方案2】:

    您的class foo 将导致您的泄漏,因为您永远不会删除动态分配的cBuffer。解决方案很简单:这里根本不需要动态分配。

    class foo {
        cBuffer buf;  // An object, not a pointer
        foo() : buf(gSize, oDist, Mode) {}
    };
    

    更一般地说,当您确实需要动态分配时,请注意始终deletenew 相同。最可靠的方法是使用容器和智能指针等 RAII 类型来为您管理所有动态资源。

    【讨论】:

    • 这里讨论了我使用指针的原因stackoverflow.com/questions/15922760/…
    • @mahmood:我没有看到任何关于指针的讨论,只是一些不好的建议告诉你在不需要时使用指针,还有一些更好的建议告诉你不要。
    猜你喜欢
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    相关资源
    最近更新 更多