gpt4 book ai didi

c++ - shared_from_this 抛出异常

转载 作者:太空狗 更新时间:2023-10-29 22:53:01 38 4
gpt4 key购买 nike

我正在编写具有类似 Blender 功能的基于 Qt 的应用程序。

它由一个“框架”组成,即 GUI + 插件系统和插件。插件是带有基本上可以创建和显示的对象(例如 Sphere、Box 等)的 Qt dll。所有这些对象一旦创建,就会以某种容器结构的形式存储在框架中,该容器结构包含它们的 shared_ptr(因此实际上容器非常类似于 vector<shared_ptr<INode>>)

我想要的是在其中一个插件中使用 shared_from_this() 函数。例如。这是一个示例插件(为清楚起见更改了代码):

class Q_DECL_IMPORT SphereNode: public INode, public Sphere

在哪里INode是:

class INode: public QObject, public boost::enable_shared_from_this<INode>

,容器中存储的所有内容的基类。所以问题是这个函数:

void SphereNode::update()
{
foo(shared_from_this());
}

抛出 boost::bad_weak_ptr异常。

一些关于如何创建 SphereNode 的注释(工厂类)

boost::shared_ptr<INode> NodeFactory::createNode(const QString& type, QString tag)
{
...
QPluginLoader loader(filesPlugin_[i]);
boost::shared_ptr<QObject> plugin(loader.instance());
boost::shared_ptr<INode> iNodePlugin = boost::shared_dynamic_cast<INode>(plugin);
return iNodePlugin;
}

有什么想法吗?

最佳答案

也许是这一行:

boost::shared_ptr<INode> iNodePlugin = boost::shared_dynamic_cast<INode>(plugin);

应该替换为:

boost::shared_ptr<INode> iNodePlugin = dynamic_cast<INode*>(loader.instance())->shared_from_this();

可能是因为:

boost::shared_ptr<QObject> plugin(loader.instance());

此处 plugin 获取返回实例的所有权。然而,Qt documentation指出实例将在销毁时由 QPluginLoader 自动释放。

但是,这宁愿导致段错误(未定义的行为),也不愿导致常规的 boost::bad_weak_ptr 异常。

如果你想防止这种情况发生,你可以指定一个 null_deleter,当引用计数器达到 0 时,它什么都不做。


您是从构造函数还是析构函数(直接或间接)调用 shared_from_this()

如果是,那就是你的问题。

当你在构造函数中时,对象还没有完全创建,所以给它一个 shared_ptr 是无效的。

为避免此问题,当对象成功构建时,您可以在工厂方法(无论如何您已经拥有)中将 shared_ptr 获取到该对象。

关于c++ - shared_from_this 抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3211269/

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