加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:22:18 所属栏目:百科 来源:网络整理
导读:根据C 03标准(5.3.4 / 7): 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
根据C 03标准(5.3.4 / 7):

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_的值是未初始化的存储器.

问题:

>在上面的代码中,实际指向的是什么?
>“分配没有元素的数组是什么意思?”
>分配具有零元素的数组有什么实际用途?

解决方法

它归结为:new [0]导致返回一个有效地址,不同于任何其他当前分配的对象,但你不能解除引用.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读