我有以下代码片段:
int nWidth = 10;
int *pData = new int[nWidth];
//I do something here
//then I free memory by:
delete pData;
这段代码会产生内存泄漏吗?我必须使用:
delete[] pData;
答案 0 :(得分:13)
如果您不使用delete[] pData
,则行为未定义。可能导致内存泄漏,可能导致程序崩溃,可能会运行得很好,直到您为最重要的客户演示程序。
答案 1 :(得分:7)
这段代码会产生内存泄漏吗?
不,它有未定义的行为,这更糟糕。
我必须使用:
delete[] pData;
是的,必须使用new[]
释放分配有delete[]
的所有内存。但是,如果提前返回或异常阻止程序到达删除表达式,它仍会产生内存泄漏。
除非您做一些不寻常的事情,否则很少需要明确管理内存。在这种情况下,标准库提供了方便的动态数组类型:
#include <vector>
std::vector<int> data(nWidth);
// Do something here.
// Memory is freed automatically when data goes out of scope.
答案 2 :(得分:4)
是的,你必须使用:
delete[] pData;
请注意以下几点w.r.t动态分配:
delete[]
new[]
delete
new
free()
malloc()
[注]
正如David在他的注释示例中正确指出的那样,规则的一个例外是多重继承,其中基类指针可能与子类的地址不同,并且将基类指针地址传递给delete
而不是子类指针地址仍然可以正常工作。
答案 3 :(得分:1)
是的,确实如此......