新的A [0] - 法律,但有什么用?它实际上做了什么?

Joh*_*ing 3 c++ new-operator

根据C++ 03标准(5.3.4/7):

当direct-new-declarator中的表达式的值为零时,将调用分配函数以分配不带元素的数组.

通过我的阅读,这意味着此代码是合法的并具有指定的效果:

#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
}
Run Code Online (Sandbox Code Playgroud)

当我在调试器下运行此代码时,我看到A永远不会调用构造函数. new不抛出,并返回一个非空的,显然有效的指针.但是,值为a->a_未初始化的内存.

问题:

  1. 在上面的代码中,a实际指向了什么?
  2. "分配没有元素的数组是什么意思?"
  3. 分配具有零元素的数组的实际用途是什么?

K-b*_*llo 5

在上面的代码中,实际指向了什么?

指向零元素数组.

"分配没有元素的数组是什么意思?"

这意味着我们得到一个有效的数组,但大小为零.我们无法访问它中的值,因为没有,但我们现在每个零大小的数组指向不同的位置,我们甚至可以创建一个迭代器到过去&a[0].所以我们可以像使用其他所有数组一样使用它.

分配具有零元素的数组的实际用途是什么?

它只是让您无需n = 0每次打电话都检查new.请注意,零大小的静态数组是非法的,因为静态数组具有来自常量表达式的静态大小.此外,允许您使用一对迭代器调用任何标准或自定义算法.