1

例如

//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

这段代码安全吗?如果不是,我应该做哪些最小的改变来保证它的安全?

4

1 回答 1

2

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

传递“this”的类似故事也会受到警告,甚至可以用于限制已构建的元素。

[class.cdtor]/3

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

于 2013-06-14T19:43:43.893 回答