Qt插槽回调直接打破我的析构函数

时间:2017-01-18 07:45:11

标签: c++ qt signals-slots

看看这个惊人的调用堆栈:

1  FNFolderTreeDir::refreshSubDir                fnfoldertreedir.cpp               42   0x13faa3287   
2  FNFolderTreeDriveRootHive::processDirLoaded   fnfoldertreedriveroothive.cpp     25   0x13faa2175   
3  FNFolderTreeDriveRootHive::qt_static_metacall moc_fnfoldertreedriveroothive.cpp 74   0x13faa5df5   
4  QMetaObject::activate                         qobject.cpp                       3742 0x51744922

......这里有很多Qt内部......

33 _purecall                                     purevirt.c                        58   0x7feedc2d0cc 
34 FNFolderTreeNode::purge                       fnfoldertreenode.cpp              28   0x13fa9cf53   
35 FNFolderTreeNode::~FNFolderTreeNode           fnfoldertreenode.cpp              23   0x13fa9ceeb

FNFolderTreeDriveRootHive::processDirLoaded是连接到QFileSystemModel::directoryLoaded信号的插槽。所以,这里发生的事情是,当Qt在一个看似随机的点中断它时,我的析构函数很乐意做一些内部清理,调用一个槽来刷新已经减少到基类的对象。当然,它崩溃了。

如果可能的话,有几个问题:

  1. 这怎么可能?我怀疑Qt使用QAbstractItemModel::beginRemoveColumnsendRemoveRows来发送回调 - 我在FNFolderTreeNode::purge中都称它们。它应该只在主循环中执行此操作吗?

  2. 如何防止此行为?可以尝试在析构函数中首先断开插槽,但是在哪里也可以保证它不会被中断?

0 个答案:

没有答案