在构造函数中使用指向(仍然)未初始化成员的指针是否安全?

时间:2013-06-14 19:37:19

标签: c++ constructor initialization

例如

//somewhere
struct IFace;

struct Base
{
    Base(IFace* iface):
    f(iface)
    {
          //will not use iface here
    }
private:
    IFace* f;
};

struct Data;
struct Implementation
{
private:
    friend IFace* factory_create(Data*);
    Implementation(Data* data): // ok, it's not private, just some internal 
                                // class not mentioned in public headers
    d(data)
    {
        //will not deref data here
    }

private:
    Data* d;
};

IFace* factory_create(Data* data)
{
    return new Implementation(data);
}


//here
struct Derived: Base
{
    Derived():
    Base(factory_create(&data)) //using pointer to uninitialized member
    {
        //will fill data here
    }

    Data data;
};

似乎我没有机会在将指针传递给data函数之前创建factory_create

这段代码安全吗?如果没有,我应该做些什么微小的改变才能使其安全?

1 个答案:

答案 0 :(得分:2)

指针是安全有效的,只要您不取消引用它,就可以使用它。将ponter值存储在注册表中以便在以后完全构造时使用它是一种相当普遍的做法。

传递'this'的类似故事也受到警告,即使可以限制已经构建的元素。

  

[class.cdtor] / 3

     

形成指向(或访问)a的指针   直接对象obj的非静态成员,构造obj   已经开始并且其销毁尚未完成,   否则计算指针值(或访问   成员值)导致未定义的行为。