【发布时间】:2010-11-08 09:25:22
【问题描述】:
一个简单的测试应用:
cout << new int[0] << endl;
输出:
0x876c0b8
所以看起来它有效。标准对此有何评论? “分配”空的内存块总是合法的吗?
【问题讨论】:
-
+1 非常有趣的问题 - 虽然我不确定它在实际代码中的重要性。
-
@Zifre:我问的是好奇心,但这在现实世界中可能很重要,例如当以某种方式计算分配的内存块的大小时,计算结果可能为零,则无需直接添加不分配零大小块的异常。因为它们应该被分配和删除而没有错误(如果只有零大小的块不被取消引用)。所以通常这会更广泛地抽象出内存块是什么。
-
@emg-2:在您的示例情况下,这实际上并不重要,因为 delete[] 在 NULL 指针上是完全合法的 :-)。
-
它只是切线相关的——所以我在这里评论——但 C++ 在许多方面确保了不同的对象具有唯一的地址......即使它们没有明确需要存储。一个相关的实验是检查空结构的大小。或该结构的数组。
-
详细说明 Shmoopty 的评论:尤其是在使用模板(例如 std::allocator 等策略类模板)编程时,C++ 中的对象大小为零是很常见的。通用代码可能需要动态分配此类对象并使用指向它们的指针来比较对象身份。这就是为什么 operator new() 为零大小的请求返回唯一指针的原因。虽然可以说不太重要/不常见,但同样的推理也适用于数组分配和运算符 new[]()。
标签: c++ memory-management new-operator standards-compliance