gpt4 book ai didi

c++ - shared_ptr 与 unique_ptr 在类(class)和 child 中的使用

转载 作者:太空狗 更新时间:2023-10-29 21:39:03 25 4
gpt4 key购买 nike

我一直在关注智能指针的使用,并努力思考它的最佳用途。我已经阅读了很多文章,但我对在下面的示例中使用哪篇文章感到困惑。我已经包含了一个 shared_ptrunique_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 来完成?这种理解使我对智能指针感到困惑,希望得到澄清。

最佳答案

嗯,这是一生的问题。你需要 SomeObject 来比 A 长寿吗? B 是否在此上下文之外发送或正在使用?你必须决定你的对象何时死亡。如果您认为 SomeObject 仅存在于此上下文中,我建议将 A 作为所有者,因为它分配资源,并且是指向 的原始指针一些对象。我看起来像这样:

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 代码没有错误。

关于c++ - shared_ptr 与 unique_ptr 在类(class)和 child 中的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33880435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com