在实现了下面的 C++ 代码之后,我跑来valgrind --leak-check=full
检查是否有任何内存泄漏。结果是退出时使用了 0 个字节,并且 不可能发生泄漏。
但是,后来我发现我忘记了使用delete[] x
,而不仅仅是delete x
在析构函数内部。
我搜索了一些解释(例如:C++ 中的 delete vs delete[] 运算符),我读到的所有内容都说使用delete
without[]
会导致内存泄漏,因为它只调用数组中第一个对象的析构函数。
我将代码更改为 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;
}