【问题标题】:Qt QObject and boost::enable_shared_from_thisQt QObject 和 boost::enable_shared_from_this
【发布时间】:2013-09-10 11:21:00
【问题描述】:

我正在使用 boost::enable_shared_from_this 模板在两个类之间创建一个 mixin。所以我在这个类中添加了一个新功能:

class MyOldClass :
        public Connection,
        public boost::enable_shared_from_this<MyOldClass>
{ ... };

我之前确实将它用于普通类(不是 QtObject,只是一个 C++ 普通类)并且一切正常。

但是现在我对 QMainWindow 做同样的事情,它基本上崩溃了:

class MainWindow :
        public QMainWindow,
        public Connection,
        public boost::enable_shared_from_this<MainWindow>
{ Q_OBJECT ... };

使用 QObject 执行此操作是否有任何问题?不知道为什么会这样。

谢谢。

【问题讨论】:

  • 您能说得更具体些吗?它在哪里崩溃,您观察到什么异常等?
  • 谢谢伊戈尔。 Connection 类有一个称为 getSharedPtr() 的纯虚方法。然后在 MainWindow 中实现此方法,只返回类型为 boost::shared_ptr 的 shared_from_this()。如果我在 Connection 类上声明了一个测试方法:getSharedPtr();我从 MainWindow 类调用这个测试方法,它崩溃了。所以问题似乎与从 MainWindow 检索 shared_from_this() 指针有关。
  • @user1963961 在调用shared_from_this() 之前,在任何地方创建的窗口是否是shared_ptr?而且无论如何,Qt 通常都有自己的所有权方案(父母拥有孩子),因此将其与shared_ptr 所有权方案混合需要非常仔细设计。
  • @Angew 不,它只被调用一次。

标签: c++ qt boost shared-ptr qobject


【解决方案1】:

您在 cmets 中提到在调用 shared_from_this() 之前不会创建 shared_ptr。但这就是问题所在。 x.shared_from_this() 仅在 shared_ptrx 存在时才有效。如果您从不创建一个,则您违反了shared_from_this() 的前提条件,因此您的程序具有未定义的行为。

shared_from_this() 仅用于检索与现有共享指针共享所有权的指针;它不能用于创建第一个。

【讨论】:

  • 你是对的,在下面检查我自己的答案(我正在混合 shared_ptr 实现)。
【解决方案2】:

好的,伙计们,这是我的错,但答案可能对某人有所帮助:

  1. 正如 Angew 所说,有必要使用 shared_ptr 创建 MainWindow 的第一个实例(我第一次不明白您的问题)。
  2. 我正在这样做我使用的是 std::shared_ptr 实现而不是 boost::shared_ptr 实现。将两者混合会产生这种结果。
  3. 它现在可以工作,但正如 Angew 所说,在 Qt 所有权方案中使用 shared_ptr 时必须非常小心。
  4. MainWindow 声明中指定的继承顺序是唯一有效的。正如 Angew 所说:“当从 QObject 或从它派生的类继承时,QObject(或该派生类)必须是基类列表中的第一个。这样就行不通了”

谢谢

【讨论】:

  • 我看不到 enable_shared_from_this 在从 QObject(或其他任何东西)继承时如何为您工作。你应该得到 bad_weak_ptr 异常。这正是我不得不发帖时想要做的事情:stackoverflow.com/questions/62131475/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多