C++:内存泄漏

4 c++ memory-leaks new-operator

问题:变量n的值是多少,以下代码会导致内存泄漏?

那是代码:


int* Bar(int n)
{
  if (n == 1)
    throw "exception";
  return new int[n];
}

void Foo(int n)
{
  int *a = Bar(n);
  if (n <= 2)
    return;
  delete[] a;
}
Run Code Online (Sandbox Code Playgroud)

从5.3.4/7开始

当direct-new-declarator中的表达式的值为零时,将调用分配函数以分配不带元素的数组.

从3.7.3.1/2开始

取消引用作为零大小请求返回的指针的效果是未定义的.

即使[new]请求的空间大小为零,请求也会失败.

这意味着你可以做到,但你不能合法地(在所有平台上以明确定义的方式)取消引用你得到的内存 - 你只能将它传递给数组删除 - 你应该删除它.

这是一个有趣的脚注(即不是标准的规范部分,但包含在说明性的傀儡中)附在3.7.3.1/2的句子上

[32.目的是通过调用malloc()或calloc()来实现operator new(),因此规则基本相同.C++与C的不同之处在于要求零请求返回非空指针.

  • 如果n为1,我们得到:

int*a = Bar(1)和Bar(1)抛出异常.它是变量a的构造函数中的异常吗?它会导致内存泄漏吗?

sha*_*oth 7

如果a == 0或a == 2,它可能会导致它们.

如果a == 1则抛出异常并且没有分配内存.如果分配和释放> 2个内存.

如果必须分配== 0内存,因为不允许new返回空指针.您必须使用delete []释放已分配的内存.

如果分配了== 2内存并且函数返回.这是一个明显的泄漏.