2

我有以下代码片段:

int nWidth = 10;
int *pData = new int[nWidth];
//I do something here
//then I free memory by:
delete pData;

这段代码是否会产生内存泄漏?我必须使用:

delete[] pData;
4

4 回答 4

13

如果您不使用delete[] pData,则行为未定义。可能导致内存泄漏,可能导致程序崩溃,在您为最重要的客户演示程序之前可以正常运行。

于 2012-09-01T15:31:38.137 回答
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.
于 2012-09-01T15:35:47.013 回答
4

是的,您必须使用:

delete[] pData;

请注意以下关于动态分配的要点:

  1. 尽可能避免动态分配
  2. delete[]如果您使用分配内存,则需要使用new[]
  3. delete如果您使用分配内存,则需要使用new
  4. free()如果您使用分配内存,则需要使用malloc()
  5. 您需要将相同的地址传递给上述所有 3 [note]中分配函数返回的解除分配函数。

[注意]
正如大卫在评论中的示例中正确指出的那样,该规则的一个例外是多重继承,其中基类指针可能与子类具有不同的地址,并将基类指针地址传递给delete而不是子类指针地址仍然可以正常工作。

于 2012-09-01T15:30:53.707 回答
1

是的,它确实如此,是的,你确实......

于 2012-09-01T15:30:52.037 回答