为什么分配成功为大小零字节?

bjs*_*123 6 c++ memory-management

这类似于零大小的数组分配/意味着什么?

我有以下代码

int *p = new int[0];
delete []p;
Run Code Online (Sandbox Code Playgroud)

p获取一个地址并被正确删除.

我的问题是:为什么c ++ Standard首先允许分配零字节?为什么不抛出bad_alloc或一些特殊的异常?

我认为,这只是推迟了灾难性的失败,使程序员的生活变得困难.因为如果要在运行时计算要分配的大小,并且如果程序员正确地假定其分配并尝试向该内存写入内容,则最终会破坏内存!并且崩溃可能发生在代码中的其他位置.

编辑:它在零大小请求时分配了多少内存?

Oli*_*rth 6

你为什么要失败?如果程序员试图读/写不存在的元素,那么这是一个错误.初始分配不是(这与例如没有区别int *p = new int[1]; p[1] = 5;).

  • @ bjskishore123:返回的地址将是唯一的.有许多数据结构需要或期望唯一的值,例如`std :: map <int*,std :: string>`. (2认同)

Pat*_*ick 5

很久以前,在使用异常之前,如果分配失败,malloc函数会返回NULL指针.

如果分配零字节也会返回NULL指针,则很难区分失败的分配和后续的零字节分配.

另一方面,如果零字节的分配将返回非NULL指针,则最终会出现两个不同的零字节分配可以具有相同指针的情况.

因此,为了简单起见,零字节的malloc函数分配1个字节.


vit*_*aut 5

3.7.3.1/2:

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

std::vector例如比较动态分配的数组。你可以有一个大小为 0 的向量,那么为什么不允许数组使用相同的向量呢?无论数组的大小是否为 0,访问数组末尾总是一个错误。