【发布时间】:2012-05-22 02:23:15
【问题描述】:
在实现下面的 C++ 代码后,我运行了valgrind --leak-check=full 以检查是否有任何内存泄漏。结果是退出时使用了 0 个字节,并且不可能有泄漏。
但是,后来我发现我忘记在析构函数中使用delete[] x 而不是只使用delete x。
我搜索了一些解释(例如:delete vs delete[] operators in C++),我读到的所有内容都说使用delete 而不使用[] 会导致内存泄漏,因为它只调用数组中第一个对象的析构函数。
我将代码更改为 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;
}
【问题讨论】:
-
您链接的问题的答案未提及内存泄漏。事实上,他们说的和下面 Als 说的一样。那你为什么说“我读到的所有内容都说使用不带[]的删除会导致内存泄漏。”?
-
另外,在您的程序标志上使用 valgrind 3.2.1 时会出现“不匹配的 free() / delete / delete[]”。这不是内存泄漏,而是错误。
-
众所周知,例如,当数组包含像
char这样的内置类型时,MSVC 恰好为delete x和delete[] x生成相同的代码。对于带有析构函数的类类型,代码不同。 -
虽然您使用不同的工具检测它,但此处的代码和问题可能与 _CrtMemDumpAllObjectsSince() function is not able to detect leaks if delete array called instead of delete []array 重复,我对这个问题的回答在这里也同样适用。
-
谢谢杰瑞,我找不到这个问题。那里的答案很有趣
标签: c++ memory-leaks valgrind delete-operator