【发布时间】:2016-03-21 08:49:51
【问题描述】:
我有以下代码示例:
#include <QCoreApplication>
#include <QSharedPointer>
#include <QDebug>
#include <memory>
class A
{
public:
A()
{
throw 1;
}
~A() { qDebug() << "A destr"; }
};
int main(int argc, char* argv[])
{
QCoreApplication a(argc, argv);
try
{
//auto m1 = std::make_shared<A>();
auto m2 = QSharedPointer<A>::create();
}
catch (...)
{
qDebug() << "catch!";
}
return a.exec();
}
上述代码的输出是:
A destr
catch!
但如果我取消注释 std::make_shared 的行,输出如下:
catch!
那么为什么QSharedPointer::create 会调用不完整对象的析构函数呢?这是一个错误还是我遗漏了什么?
我用MSVC2013 + Qt 5.5.1 和MSVC2015 + Qt 5.6 (从源代码构建)进行了尝试。结果是一样的。
【问题讨论】:
-
作为参考,您的特定版本的
QSharedPointer::create()的源代码在这里:code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/tools/… - 我假设您在构建时没有定义QT_SHAREDPOINTER_TRACK_POINTERS? -
这是五年前提交的一个可能与 Qt 相关的错误(此后没有活动):bugreports.qt.io/browse/QTBUG-14637
-
@JohnZwinck 是的,它没有定义。据我了解,此标志用于调试拥有同一对象的多个智能指针。还是我应该试一试?
-
无需定义它——我只是想了解您实际使用的代码路径。现在很明显,Qt 中存在一个错误,我在下面的回答中对此进行了描述。
-
@JohnZwinck 谢谢,评论前没有更新页面。
标签: c++ qt c++11 qsharedpointer