gpt4 book ai didi

c++ - 返回 boost::shared_ptr 和从返回的原始指针构造 boost::shared_ptr 有什么区别?

转载 作者:行者123 更新时间:2023-11-28 00:42:07 30 4
gpt4 key购买 nike

谁能告诉我这两种方法在如下使用时的区别?

如果我使用 CreateBoostContainer,我的代码运行良好。但是,如果我使用 CreateContainer,当我尝试在 ContainerC 上使用 shared_from_this 时,我稍后会在函数 Foo 的代码中得到一个 boost::bad_weak_ptr 异常。我只使用一个线程。

谢谢!

用法:

SceneElementNodeC* poNode(new SceneElementNodeC(CreateBoostContainer()));
SceneElementNodeC* poNode(new SceneElementNodeC(boost::shared_ptr<SceneElementI>(CreateContainer())));

定义:

boost::shared_ptr<SceneElementI> LoaderC::CreateBoostContainer() const
{
return boost::shared_ptr<SceneElementI>(new ContainerC());
}

SceneElementI* LoaderC::CreateContainer() const
{
return new ContainerC();
}

场景元素节点C:

class SceneElementNodeC
{
SceneElementNodeC(boost::shared_ptr<SceneElementI> spSceneElement)
: m_spSceneElement(spSceneElement)
{};
}

容器C:

class ContainerC : public SceneElementI, public boost::enable_shared_from_this<ContainerC>
{
ContainerC()
{};

void Foo(VisitorI* poVisitor)
{
poVisitor->Visit(shared_from_this());
};
}

最佳答案

首先,CreateBoostContainer是一个可怕的名字,Boost 库包含数百个组件,其中包括多个容器,shared_ptr只是 Boost 的一小部分。如果您稍后更改代码以返回 std::shared_ptr相反,您必须重命名函数,所以您将其更改为 CreateStdContainer ?!

其次,你没有提供完整的代码来重现问题,所以根据 Stackoverflow 的规则,你的问题应该被关闭!我猜你的类型是这样定义的:

class ContainerC
: public SceneElementI, public boost::enable_shared_from_this<ContainerC>
{
// ...
};

不同的是在这个函数中:

boost::shared_ptr<SceneElementI> LoaderC::CreateBoostContainer() const
{
return boost::shared_ptr<SceneElementI>(new ContainerC());
}

您初始化 shared_ptrContainerC*所以 shared_ptr构造函数能够检测到有一个 enable_shared_from_this基类(通过隐式向上转换为 enable_shared_from_this<ContainerC> )

而在这个函数中:

SceneElementI* LoaderC::CreateContainer() const
{
return new ContainerC();
}

在创建 shared_ptr 之前将指针转换为基类会丢失有关对象动态类型的信息.返回的指针是SceneElementI*其中(我假设)没有 enable_shared_from_this基类,因此当该指针稍后用于初始化 shared_ptr 时无法判断它指向的类型的基类也是从 enable_shared_from_this<ContainerC> 派生的。 .

您可以通过这样做使第一个函数也无法工作:

boost::shared_ptr<SceneElementI> LoaderC::CreateBoostContainer() const
{
SceneElementI* ptr = new ContainerC();
return boost::shared_ptr<SceneElementI>(ptr);
}

这是等价的,因为它将指针转换为 SceneElement*在创建 shared_ptr 之前.

shared_ptr很聪明,并利用你构造它的指针类型,即使这不是存储在 shared_ptr 中的类型。 , 所以如果你先向上转换那个指针然后 shared_ptr不能聪明。

关于c++ - 返回 boost::shared_ptr 和从返回的原始指针构造 boost::shared_ptr 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18352418/

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