成员对象,引用和shared_ptr

时间:2013-12-20 21:21:19

标签: c++

所以,我发现自己做了很多,并想知道这是否正确(这可能不会编译 - 我在手机上写这个):

class Shared
{
private:
    int _x;
public:
    void X(int newValue) { _x = newValue; } 
    int X() { return _x; } 

    Shared(void) : _x(0)
    {
    }
};

class Owner
{
private:
    shared_ptr<Shared> _shared;

public:
    const Shared& Shared() const
    {
        return *_shared;
    }

    void Shared(const Shared& newValue)
    {
        _shared.reset(&newValue);
    }

    void DoSomethingWithShared()
    {
        /// yeah, this could be cleaner, not the point!
        _shared.X(_shared.X() + 1);
    }

};

void CreateStuff(Owner& a, Owner &b)
{
    Shared s;

    a.Shared(s);
    b.Shared(s);

}




int main(int argc, char *argv[])
{
    Owner a;
    Owner b;
    CreateStuff(a,b);

    a.DoSomethingWithShared();
    b.DoSomethingWithShared();
    ///...



    /// "Shared" instance created in CreateStuff() hopefully lives until here...

}

这个想法是Owner的多个实例需要类型为Shared的共享资源。

  • CreateStuff()出错? (即s是否超出范围,ab指向被破坏对象的无效指针?(我是否以迂回方式返回临时地址?)< / p>

  • 我还没有看到任何其他范围/ GC问题吗?

  • 有更简单的方法吗?

1 个答案:

答案 0 :(得分:1)

CreateStuff肯定是错误的。您(最终)将指向局部变量的指针传递到shared_ptr s,这比该变量更长。一旦它超出范围,你将在_shared s内有两个悬空指针。

由于您正在使用智能指针,为什么不在堆上动态分配Shared,让智能指针担心在完成后删除它?

void CreateStuff(Owner& a, Owner &b)
{
    std::shared_ptr<Shared> s(new Shared);

    a.Shared(s);  // have that Shared() modified to take the shared_ptr,
    b.Shared(s);  // of course
}