【问题标题】:Deleting object that inherits from QWidget, WA_DeleteOnClose segmentation fault删除继承自 QWidget 的对象,WA_DeleteOnClose 分段错误
【发布时间】:2017-02-21 16:42:48
【问题描述】:

我正在使用一个继承 QWidget 的对象,为了知道它何时关闭,我使用了setAttribute(Qt::WA_DeleteOnClose),并已连接

connect(myObj,SIGNAL(destroyed(QObject*)),this,SLOT(handleFinish()));

但是,当对象被删除时,我得到munmap_chunk(): invalid pointer,而当我查看指针的地址时,它是myObj的数据成员之一,它确实不是指针。

我动态分配 myObj,所以它应该在堆上 - myObj = new myObj(); 错误出现在 myObj 析构函数的末尾,我检查了这是第一次调用析构函数(在查看When setting the WA_DeleteOnClose attribute on a Qt MainWindow, the program crashes when deleting the ui pointer 之后)。

对处理它有什么建议吗?

【问题讨论】:

  • handleFinish() 插槽是否被调用?你正在破坏你的记忆。我认为除非您提供MCVE,否则这个问题是无法回答的。尝试通过从析构函数中临时删除语句和/或删除成员数据(在对象被销毁时被破坏)来隔离问题,并观察在注释掉时不会导致崩溃的语句/成员变量。跨度>

标签: c++ qt memory-management qwidget


【解决方案1】:

当您收到destroyed 信号时,该对象只是QObject - 不是QWidget,而且绝对不是任何派生类型。您只能访问通过QObject 提供的成员和方法,不能通过任何其他类型访问。

您似乎希望在小部件即将关闭时收到通知:为此,请在小部件上安装一个拦截 QEvent::close 的事件过滤器。另见this answera discussion of why a closeEvent cannot be generally handled via a slot

【讨论】:

  • 谢谢,看起来正是我需要的。
猜你喜欢
  • 2021-10-29
  • 1970-01-01
  • 2018-02-12
  • 1970-01-01
  • 1970-01-01
  • 2015-08-27
  • 2023-03-30
  • 2018-11-27
  • 1970-01-01
相关资源
最近更新 更多