【发布时间】:2010-11-11 07:58:32
【问题描述】:
问题:当变量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] -- will it allocate memory?)
从 5.3.4/7 开始
当表达式的值在一个 direct-new-declarator 为零,则 调用分配函数 分配一个没有元素的数组。
从 3.7.3.1/2 开始
取消引用指针的效果 作为对零大小的请求返回的是 未定义。
还有
即使空间大小 请求 [by new] 为零,则 请求可能会失败。
这意味着你可以做到,但你可以 不合法(以明确的方式 跨所有平台)取消引用 你得到的记忆——你只能 将它传递给数组删除 - 你 应该删除它。
这是一个有趣的脚注(即 不是标准的规范部分, 但包括用于说明性目的) 附在句子的后面 3.7.3.1/2
[32.目的是让运营商 new() 可通过调用实现 malloc() 或 calloc(),所以规则是 基本相同。 C++ 不同 从 C 中要求零请求到 返回一个非空指针。]
- 如果 n 为 1,我们得到:
int *a = Bar(1) 和 Bar(1) 抛出异常。它会是变量a的构造函数中的异常吗?而且会不会造成内存泄露?
【问题讨论】:
-
Bar 中的 if 语句是否应该围绕以下两行,或者只是 throw 语句?
标签: c++ memory-leaks new-operator