根据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_未初始化的内存.
问题:
a实际指向了什么?在上面的代码中,实际指向了什么?
指向零元素数组.
"分配没有元素的数组是什么意思?"
这意味着我们得到一个有效的数组,但大小为零.我们无法访问它中的值,因为没有,但我们现在每个零大小的数组指向不同的位置,我们甚至可以创建一个迭代器到过去&a[0].所以我们可以像使用其他所有数组一样使用它.
分配具有零元素的数组的实际用途是什么?
它只是让您无需n = 0每次打电话都检查new.请注意,零大小的静态数组是非法的,因为静态数组具有来自常量表达式的静态大小.此外,允许您使用一对迭代器调用任何标准或自定义算法.
| 归档时间: |
|
| 查看次数: |
265 次 |
| 最近记录: |