实施下面的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;
}