以下代码片段中是否有内存泄漏?

时间:2012-09-01 15:28:43

标签: c++ memory-leaks

我有以下代码片段:

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

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

delete[] pData;

4 个答案:

答案 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动态分配:

  1. 尽可能避免动态分配
  2. 如果您使用delete[]
  3. 分配内存,则需要使用new[]
  4. 如果您使用delete
  5. 分配内存,则需要使用new
  6. 如果您使用free()
  7. 分配内存,则需要使用malloc()
  8. 您需要将相同的地址传递给上述所有3 [note] 中的分配函数返回的解除分配函数。
  9. [注]
    正如David在他的注释示例中正确指出的那样,规则的一个例外是多重继承,其中基类指针可能与子类的地址不同,并且将基类指针地址传递给delete而不是子类指针地址仍然可以正常工作。

答案 3 :(得分:1)

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