When the value of the Expression in a direct-new-declarator is zero,
the allocation function is called to allocate an array with no
elements.
通过我的阅读,这意味着此代码是合法的并具有指定的效果:
#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_的值是未初始化的存储器.
问题:
>在上面的代码中,实际指向的是什么?
>“分配没有元素的数组是什么意思?”
>分配具有零元素的数组有什么实际用途?
它的典型用途是使用代码来分配不同大小的数组,因此有时您可能会有一个元素数量为正的数组,但有时候数组的元素数为零.即使你不能取消引用它,使用“普通”(有效)指针而不是(例如)空指针仍然可以简化相当多的代码.
仅举一个例子,考虑存储数组起始地址的典型情况,以及超出数组末尾的地址(并且具有从一个遍历到另一个的循环).使用空指针,你不能像那样进行算术运算,所以任何处理一个过去结束指针的东西都需要一个空指针的特殊外壳.对于无法取消引用的有效非空指针,您仍然可以形成起始地址和结束地址,而无需任何特殊情况.而不是只为非空指针执行循环的特殊情况代码,您编写正常循环,当数组为空时执行零迭代.
总结以上是内存溢出为你收集整理的c – 新A [0] – 法律,但有什么用?它实际上做了什么?全部内容,希望文章能够帮你解决c – 新A [0] – 法律,但有什么用?它实际上做了什么?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)