bjs*_*123 6 c++ memory-management
这类似于零大小的数组分配/意味着什么?
我有以下代码
int *p = new int[0];
delete []p;
Run Code Online (Sandbox Code Playgroud)
p获取一个地址并被正确删除.
我的问题是:为什么c ++ Standard首先允许分配零字节?为什么不抛出bad_alloc或一些特殊的异常?
我认为,这只是推迟了灾难性的失败,使程序员的生活变得困难.因为如果要在运行时计算要分配的大小,并且如果程序员正确地假定其分配并尝试向该内存写入内容,则最终会破坏内存!并且崩溃可能发生在代码中的其他位置.
编辑:它在零大小请求时分配了多少内存?
你为什么要失败?如果程序员试图读/写不存在的元素,那么这是一个错误.初始分配不是(这与例如没有区别int *p = new int[1]; p[1] = 5;).
很久以前,在使用异常之前,如果分配失败,malloc函数会返回NULL指针.
如果分配零字节也会返回NULL指针,则很难区分失败的分配和后续的零字节分配.
另一方面,如果零字节的分配将返回非NULL指针,则最终会出现两个不同的零字节分配可以具有相同指针的情况.
因此,为了简单起见,零字节的malloc函数分配1个字节.
3.7.3.1/2:
[32. 目的是通过调用 malloc() 或 calloc() 来实现 operator new(),因此规则基本相同。C++ 与 C 的不同之处在于要求零请求返回非空指针。]
std::vector例如比较动态分配的数组。你可以有一个大小为 0 的向量,那么为什么不允许数组使用相同的向量呢?无论数组的大小是否为 0,访问数组末尾总是一个错误。
| 归档时间: |
|
| 查看次数: |
1934 次 |
| 最近记录: |