Valgrind不报告"删除阵列"上的内存泄漏

Moa*_*nti 0 c++ valgrind memory-leaks delete-operator

在实现下面的C++代码后,我运行valgrind --leak-check=full以检查是否有任何内存泄漏.结果是在退出时使用了0个字节,并且 没有泄漏是可能的.

然而,后来我发现我忘了使用delete[] x而不是仅仅delete x在析构函数中使用.

我搜索了一些解释(例如:C++中的delete vs delete []运算符),我读到的所有内容都说使用deletewithout []会导致内存泄漏,因为它只调用数组中第一个对象的析构函数.

我将代码更改为删除[],并且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;
}
Run Code Online (Sandbox Code Playgroud)

Alo*_*ave 7

使用delete而不使用[]会导致内存泄漏.

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

使用new []和取消分配使用的程序delete具有未定义的行为.实际上,你很幸运(相当不幸)它没有表现出一些奇怪的行为.

作为旁注,您还需要遵循您的课程的三级规则.目前,你不这样做,并在不久的将来呼吁麻烦.