8

次のコード例があります。

#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.1MSVC2015+ Qt 5.6(ソースからビルド)で試してみました。結果は同じです。

4

2 に答える 2