次のコード例があります。
#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
(ソースからビルド)で試してみました。結果は同じです。