6

Qt で、スロットが呼び出されるまでにオブジェクトが削除されるような一時オブジェクトからシグナルが呼び出された場合、それはエラーですか?

関連する場合、コードは一時オブジェクトのコンストラクターからシグナルを発しています。

(注: 引数として渡されるポインタや参照はありません。したがって、これはダングリング ポインタや参照に関する問題ではありません。最も単純な形式で、一時オブジェクトからシグナルを発行することが許容されるかどうかを知りたいだけです。 Qt で)

これが私のコードの短縮版です:

// My application
class HandyApplication: public QApplication
{
    Q_OBJECT
    public:
        explicit HandyApplication( int argc, char * argv[] );

    signals:

    public slots:
        void handySlot(std::string const msg);

};

// Class that will be instantiated to a temporary object
class Handy: public QObject
{
    Q_OBJECT

    public:

        Handy()
        {
            QObject::connect(this, SIGNAL(handySignal(std::string const)), 
                 QCoreApplication::instance(),
                 SLOT(handySlot(std::string const)));

            emit handySignal("My Message");
        }

    signals:

         void handySignal(std::string const msg);

};

// An unrelated function that may be called in another thread
void myFunction()
{
    Handy temporaryObject; // This constructor call will emit the signal "handySignal" above
}

ご覧のとおり、一時オブジェクトはコンストラクターからシグナルを発行し、すぐに破棄されます。 したがって、スロットは、シグナルを送信したオブジェクトが破棄された後に呼び出される場合があります

これは安全ですか、それとも潜在的な問題またはエラー状態ですか?

4

2 に答える 2

1

QObject::destroyed「オブジェクトobjが破棄される直前に放出される」ため、一時オブジェクトからの放出は安全だと思います-Qt docs

したがって、おそらく一時オブジェクトから発行されたシグナルは安全で適切です。

于 2016-09-13T15:29:36.793 に答える