Valgrind的不“删除阵列”报告内存泄漏(Valgrind does not report me

2019-07-29 09:11发布

实施下面的C ++代码后,我跑valgrind --leak-check=full ,以检查是否有任何内存泄漏。 其结果是0字节是在退出使用无泄漏是可能的

不过,后来我发现,我忘记使用delete[] x ,而不是仅仅delete x的析构函数中。

我搜索一些解释(例如: 删除VS删除[]在C ++运营商 ),并且我读一切说,使用delete而不[]可引起内存泄漏,因为它要求只是用于阵列中的第一个对象的析构函数。

我改变了代码来删除[]与Valgrind的输出是相同的(如预期)。 但现在我很困惑:“有没有用Valgrind的问题,还是delete真正起作用的罚款阵列,即使没有操作[] ?”

#include <iostream>
#include <string.h>
using namespace std;
class Foo {
  private: char *x;
  public:
    Foo(const char* px) {
       this->x = new char[strlen(px)+1];
       strcpy(this->x, px);
    }
    ~Foo() {
       delete x;
    }
    void printInfo() {  cout << "x: " << x << endl;  }
};
int main() {
   Foo *objfoo = new Foo("ABC123");
   objfoo->printInfo();
   delete objfoo;
   return 0;
}

Answer 1:

使用删除而不[]导致内存泄漏。

不,它会导致未定义的行为

你的程序中你使用分配new []使用和释放delete已未定义行为。 其实,你是幸运的(而倒霉),它不表现出一些怪异的行为。

作为一个侧面说明,你还需要遵循的三大法则为你的类。 目前,你不这样做,并呼吁在不久的将来麻烦。



Answer 2:

之间的主要区别delete ,并delete[]是不是内存释放,但关于析构函数调用。

虽然在形式上不确定的行为 ,在实践中会或多或少地工作......只是delete只会调用第一个项目的析构函数。

作为一个侧面说明,你可能会得到一个问题:

#include <iostream>

struct A{
  ~A() { std::cout << "destructor\n"; }
};

int main() {
  A* a = new A[10];
  delete a;
}

有一点像:

*** glibc detected *** ./prog: munmap_chunk(): invalid pointer: 0x093fe00c ***
======= Backtrace: =========
/lib/libc.so.6[0xb759dfd4]
/lib/libc.so.6[0xb759ef89]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/libstdc++.so.6(_ZdlPv+0x21)[0xb77602d1]
./prog(__gxx_personality_v0+0x18f)[0x8048763]
./prog(__gxx_personality_v0+0x4d)[0x8048621]
======= Memory map: ========

看到它ideone 。



文章来源: Valgrind does not report memory leak on “delete array”