我开始使用智能指针,并试图理解最佳用法。我阅读了很多文章,但对以下示例中应该使用哪种智能指针感到困惑。我包含了shared_ptr
和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:
public:
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作为引用传递,那么在B:PassUnique中设置ptrUnqiue = ptr_unique
会创建一个副本,这样就不正确了吗?还是应该通过shared_ptr来完成?这对智能指针的理解对我来说很困惑,希望得到澄清。
ptrUnique = ptr_unique
.. 所以你的问题似乎有点无效。http://en.cppreference.com/w/cpp/memory/unique_ptr/operator%3D - default