【发布时间】:2012-06-19 22:01:22
【问题描述】:
根据 C++03 标准(5.3.4/7):
当直接新声明符中表达式的值为零时, 调用分配函数来分配一个没有 元素。
根据我的阅读,这意味着该代码是合法的并且具有特定的效果:
#include <iostream>
#include <string>
using namespace std;
class A
{
public:
A() : a_(++aa_) {};
int a_;
static int aa_;
};
int A::aa_ = 0;
int main()
{
A* a = new A[0];
// cout << "A" << a->a_ << endl; // <-- this would be undefined behavior
}
当我在调试器下运行这段代码时,我看到A 的构造函数从未被调用过。 new 不会抛出,而是返回一个非空的、明显有效的指针。但是,a->a_ 处的值是未初始化的内存。
问题:
- 在上面的代码中,
a究竟指向什么? - “分配一个没有元素的数组”是什么意思?
- 分配一个元素为零的数组有什么实际用途?
【问题讨论】:
-
a指向一个零元素数组。这么难理解吗? -
@HotLicks:是的,有点。让我的头爆炸了。 :)
-
我这里最大的问题是#3。分配一个零元素数组有什么实际用途?
-
@JohnDibling:这意味着用户代码不需要检查零。
-
#3的好处是接口是统一的,所以如果你有一个对象可以有一个“最多N”个元素的固定数组组件,你可以处理,无需特殊情况,
N==0案例。
标签: c++ new-operator