看看这个惊人的调用堆栈:
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在一个看似随机的点中断它时,我的析构函数很乐意做一些内部清理,调用一个槽来刷新已经减少到基类的对象。当然,它崩溃了。
如果可能的话,有几个问题:
这怎么可能?我怀疑Qt使用QAbstractItemModel::beginRemoveColumns
或endRemoveRows
来发送回调 - 我在FNFolderTreeNode::purge
中都称它们。它应该只在主循环中执行此操作吗?
如何防止此行为?可以尝试在析构函数中首先断开插槽,但是在哪里也可以保证它不会被中断?