问题:在变量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;
}
- 很明显,如果 n 为 2,就会有内存泄漏。
- 如果 n 为 0,则可能会
发生内存泄漏(根据 C++ new int[0] - 它会分配内存吗?)
从 5.3.4/7
当 direct-new-declarator 中表达式的值为零时,调用分配函数来分配一个没有元素的数组。
从 3.7.3.1/2
取消引用作为零大小请求返回的指针的效果是未定义的。
还
即使 [by new] 请求的空间大小为零,请求也可能失败。
这意味着您可以这样做,但是您不能合法地(以在所有平台上以明确定义的方式)取消引用您获得的内存-您只能将其传递给数组删除-您应该删除它。
这是一个有趣的脚注(即不是标准的规范部分,但包括用于说明目的)附加到 3.7.3.1/2 的句子中
[32. 目的是通过调用 malloc() 或 calloc() 来实现 operator new(),因此规则基本相同。C++ 与 C 的不同之处在于要求零请求以返回非空指针。]
- 如果 n 为 1,我们得到:
int *a = Bar(1) 和 Bar(1) 抛出异常。它会是变量a的构造函数中的异常吗?它会导致内存泄漏吗?