2015-11-23 32 views
3

我使用智能指针,并试图总结我的头周围最好使用它盯着。我读过大量的文章,但我很困惑在下面的例子中使用哪一个。我已经包含了shared_ptrunique_ptr例子来说明什么,我试图完成:shared_ptr的VS的unique_ptr使用类和儿童

class A 
    public: 
    A(); 
    private: 
    unique_ptr<B> ptrB; 

    unique_ptr<SomeObject> ptrUnique; 
    shared_ptr<SomeObject> ptrShared; 

A::A() 
{ 
    ptrB(new B()); 

    ptrUnique(new SomeObject()); 
    ptrB->PassUnique(ptrUnique); 

    ptrShared(new SomeObject()); 
    ptrB->PassShared(ptrShared); 
} 

class B: 
    pubic: 
    void PassUnique(unique_ptr<SomeObject> &ptr_unique); 
    void PassShared(weak_ptr<SomeObject> &ptr_weak); 
    void DoSomething(); 
    private: 
    unique_ptr<SomeObject> ptrUnique; 
    weak_ptr<SomeObject> ptrWeak; 

B::PassUnique(unique_ptr<SomeObject> &ptr_unique) 
{ 
    ptrUnique = ptr_unique; 
} 

B::PassShared(weak_ptr<SomeObject> &ptr_weak) 
{ 
    ptrWeak = ptr_weak; 
} 

B::DoSomething() 
{ 
    ptrUnique->SomeMethod(); 

    shared_ptr<SomeObject> ptr1 = ptrWeak.lock(); 
    ptr1->SomeMethod(); 
} 

SomeObject类可以是任何类。一个很好的例子是我从父类A传递的数据库句柄,它最初是由多个类(如B)启动的,并且从B到C(如果存在)。我的问题是,如果我传递一个unique_ptr作为参考将设置例如ptrUnqiue = ptr_unique B:PassUnique创建一个副本,然后是不正确的?或者应该通过shared_ptr完成?这种理解与我的智能指针混淆,并希望澄清。

+0

你不能这样做'ptrUnique = ptr_unique' ..所以你的问题似乎有点空洞。 http://en.cppreference.com/w/cpp/memory/unique_ptr/operator%3D – Default

+0

谢谢我不太确定使用情况。 – adviner

回答

1

那么,这是一个有生之年的问题。你需要SomeObject以超越AB发送或正在使用这种情况之外吗?你必须决定你的物体何时死亡。如果你认为SomeObject只存在于这种情况下,我会建议A是所有者,因为它分配资源,并且是旧的指向SomeObject的原始指针。我是这样的:

class A 
    public: 
    A(); 
    private: 
    unique_ptr<B> ptrB; 

    unique_ptr<SomeObject> ptrUnique; 

A::A() 
{ 
    ptrB(new B()); 

    ptrUnique(new SomeObject()); 
    ptrB->PassUnique(*ptrUnique); 
} 

class B: 
    pubic: 
    void PassUnique(SomeObject& obj); 
    void DoSomething(); 
    private: 
    SomeObject* ptrUnique; 

B::PassUnique(SomeObject& obj) 
{ 
    ptrUnique = &obj; 
} 

B::DoSomething() 
{ 
    ptrUnique->SomeMethod(); 
} 

有作为

ptrUnique = ptr_unique; 

没有这样的事情,如果你需要SomeObject使用这种结构的外资,然后用std::shared_ptr去像你这样。您的std::shared_ptr代码没有错误。

+0

感谢您对示例的说明。是SomeObject将从发起并传递给B.也许从B到C,但发起人将永远是一个 – adviner

+0

以往是否使用B :: PassUnique(的unique_ptr &ptr_unique)是一个好主意,而不是B :: PassUnique (SomeObject&obj)? – adviner

+0

我不会推荐它。为什么?因为它不是const的,所以你的'PassUnique'函数可能是邪恶的,并且可以通过'reset'和'release'函数释放指针。但传递一个'unique_ptr'作为参考的用处很少,所以我会保持这个简单并传递一个'observer_ptr',但是现在还没有这样的东西,所以解决方法是通过原始指针或通过引用传递像我的例子。 –

0

回答基本上是什么将在A,B和/或C的指针的寿命可以把它看成范围,[A ... A),[B ... b)和[C. ..C)。如果[B ... b]总是在[A ... a]之内并且[C ... c]总是在[B ... b]之内,他们就像俄罗斯娃娃的等级一样, to-ptr是可以的。如果范围重叠并且变化很大,所以你不能真正控制最后一个ptr将被销毁的位置,并且对象将被删除,你必须使用shared_ptr。

+0

再次阅读该问题。 OP询问有关特定问题 – Default

+0

感谢您帮助解决此问题 – adviner