c – 新A [0] – 法律,但有什么用?它实际上做了什么?
根据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不抛出,并返回一个非null,显然有效的指针.但是,a-> a_的值是未初始化的存储器. 问题: >在上面的代码中,实际指向的是什么? 解决方法
它归结为:new [0]导致返回一个有效地址,不同于任何其他当前分配的对象,但你不能解除引用.
它的典型用途是使用代码来分配不同大小的数组,因此有时您可能会有一个元素数量为正的数组,但有时候数组的元素数为零.即使你不能取消引用它,使用“普通”(有效)指针而不是(例如)空指针仍然可以简化相当多的代码. 仅举一个例子,考虑存储数组起始地址的典型情况,以及超出数组末尾的地址(并且具有从一个遍历到另一个的循环).使用空指针,你不能像那样进行算术运算,所以任何处理一个过去结束指针的东西都需要一个空指针的特殊外壳.对于无法取消引用的有效非空指针,您仍然可以形成起始地址和结束地址,而无需任何特殊情况.而不是只为非空指针执行循环的特殊情况代码,您编写正常循环,当数组为空时执行零迭代. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |