这类似于What does zero-sized array allocation do/mean?
我有以下代码
int *p = new int[0];
delete []p;
p获取一个地址并被正确删除。
我的问题是:为什么c ++ Standard首先允许分配零字节? 为什么不抛出bad_alloc或一些特殊的例外?
我认为,这只是推迟了灾难性的失败,使程序员的生活变得困难。因为如果要在运行时计算要分配的大小,并且如果程序员正确地假定其分配并尝试向该内存写入内容,则最终会破坏内存!和崩溃可能发生在代码中的其他地方。
编辑:在零大小请求时分配多少内存?
答案 0 :(得分:6)
为什么要让它失败?如果程序员试图读/写不存在的元素,那么这是一个错误。初始分配不是(这与例如int *p = new int[1]; p[1] = 5;
没有区别。)
答案 1 :(得分:5)
很久以前,在使用异常之前,如果分配失败,malloc函数会返回NULL指针。
如果分配零字节也会返回NULL指针,那么很难区分失败的分配和后续的零字节分配。
另一方面,如果零字节的分配将返回非NULL指针,则最终会出现两个不同的零字节分配可以具有相同指针的情况。
因此,为了简单起见,零字节的malloc函数分配1个字节。
答案 2 :(得分:4)
3.7.3.1/2:
[32。目的是通过调用malloc()或calloc()来实现operator new(),因此规则基本相同。 C ++与C的不同之处在于要求零请求返回非空指针。]
比较动态分配的数组到std::vector
。你可以有一个大小为0的向量,那么为什么不允许数组相同呢?无论大小是否为0,访问数组末尾始终是一个错误。
答案 3 :(得分:3)
对于int [N]也是如此,其中N> 0:
因为如果要在运行时计算要分配的大小,并且如果程序员正确地假定其分配并尝试写 那个内存的某些内容,最终会破坏内存!和崩溃可能发生在代码中的其他地方。
答案 4 :(得分:2)
ISO {+ 3}}
下的ISO C ++标准涵盖了零大小的数组分配当direct-new-declarator中的表达式的值为零时,调用分配函数来分配没有元素的数组。
这使得执行dnaymic数组分配的代码更容易。
一般情况下:如果有人调用一个函数并要求它返回一个带有n(在你的情况下是0)元素的数组,那么代码不应该试图通过n-nth元素读取返回的数组。
所以,我并没有真正看到灾难性的失败,因为对于任何一个n,代码都会出错。
正如你所说:
因为如果要在运行时计算要分配的大小,并且程序员是否正确地分配了
计算出的大小为“0”,如果他试图访问超过他计算出的大小那么,那么......我正在重复自己;)