gpt4 book ai didi

c++ - 如何初始化作为类成员的 shared_ptr?

转载 作者:IT老高 更新时间:2023-10-28 12:34:50 27 4
gpt4 key购买 nike

我不确定初始化作为类成员的 shared_ptr 的好方法。你能告诉我,我在 C::foo() 中选择的方式是否很好,或者有没有更好的解决方案?

class A
{
public:
A();
};

class B
{
public:
B(A* pa);
};

class C
{
boost::shared_ptr<A> mA;
boost::shared_ptr<B> mB;
void foo();
};

void C::foo()
{
A* pa = new A;
mA = boost::shared_ptr<A>(pa);
B* pB = new B(pa);
mB = boost::shared_ptr<B>(pb);
}

最佳答案

您的代码非常正确(可以正常工作),但您可以使用初始化列表,如下所示:

C::C() :
mA(new A),
mB(new B(mA.get())
{
}

哪个更正确,更安全。

如果,无论出于何种原因,new Anew B抛出,你不会有泄漏。

如果 new A抛出,然后没有分配内存,并且异常也会中止您的构造函数。什么都没有构建。

如果 new B抛出,异常仍然会中止你的构造函数:mA将被正确销毁。

当然,因为 B 的实例需要一个指向 A 实例的指针,成员的声明顺序事项

您的示例中的成员声明顺序是正确的,但如果颠倒了,那么您的编译器可能会提示 mBmA 之前初始化蜜蜂和 mB 的实例化可能会失败(因为 mA 尚未构造,因此调用 mA.get() 会调用未定义的行为)。


我还建议您使用 shared_ptr<A>而不是 A*作为您的B 的参数构造函数(if 是有意义的,如果您可以接受少量开销)。可能会更安全。

也许可以保证 B 的实例没有 A 的实例就无法生存然后我的建议不适用,但我们在此缺乏上下文来就此给出明确的建议。

关于c++ - 如何初始化作为类成员的 shared_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3545450/

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