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