C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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]导致返回一个有效地址,不同于任何其他当前分配的对象,但你不能解除引用.

它的典型用途是使用代码来分配不同大小的数组,因此有时您可能会有一个元素数量为正的数组,但有时候数组的元素数为零.即使你不能取消引用它,使用“普通”(有效)指针而不是(例如)空指针仍然可以简化相当多的代码.

仅举一个例子,考虑存储数组起始地址的典型情况,以及超出数组末尾的地址(并且具有从一个遍历到另一个的循环).使用空指针,你不能像那样进行算术运算,所以任何处理一个过去结束指针的东西都需要一个空指针的特殊外壳.对于无法取消引用的有效非空指针,您仍然可以形成起始地址和结束地址,而无需任何特殊情况.而不是只为非空指针执行循环的特殊情况代码,您编写正常循环,当数组为空时执行零迭代.

大佬总结

以上是大佬教程为你收集整理的c – 新A [0] – 法律,但有什么用?它实际上做了什么?全部内容,希望文章能够帮你解决c – 新A [0] – 法律,但有什么用?它实际上做了什么?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: