代码之家  ›  专栏  ›  技术社区  ›  tarulen

作为默认初始化的分配

  •  16
  • tarulen  · 技术社区  · 7 年前

    说我有一个 struct (或类)具有动态数组、其长度和构造函数:

    struct array {
        int l;
        int* t;
        array(int length);
    };
    
    array::array(int length) {
        l=length;
        t=new int[l];
    }
    

    struct array {
        int l;
        int* t = new int[l];
        array(int length);
    }
    
    array::array(int length) {
        l=length;
    }
    

    它看起来很糟糕,所以我想知道这是否完全是出于运气和未定义的行为,或者是否有一些内部规则使这段代码工作良好。

    2 回复  |  直到 7 年前
        1
  •  28
  •   Baum mit Augen    7 年前

    此代码不正确。

    int* t = new int[l]; 以前会发生吗 l=length; ,从而读取未初始化的变量 l 构造函数的主体运行。

    array::array(int length) : l{length} {}
    

    L t .

    然而 首先,用手来做这件事是个坏主意。你应该使用 std::vector

        2
  •  10
  •   songyuanyao    7 年前

    第二个代码段可能具有未定义的行为。

    array 什么时候 t 已初始化 l 尚未初始化。对于具有自动和动态存储持续时间的对象 L 将初始化为不确定值,然后使用 (即。 new int[l] )导致UB。

    l=length;

    顺便说一句:使用成员初始值设定项列表,第一个代码段可以重写为

    array::array(int length) : l(length), t(new int[l]) {
    }