2011-12-30 14 views
6

considerare questo banco di prova:Perché QObject ha distrutto il segnale chiamato DOPO la distruzione?

class MyObject : public QObject 
{ 
    Q_OBJECT 
public: 
    MyObject() { qDebug() << "MyObject constructor"; } 
    virtual ~MyObject() { qDebug() << "MyObject destructor"; } 
}; 

class Tracker : public QObject 
{ 
    Q_OBJECT 
public: 
    Tracker() {} 

public slots: 
    void onDestructor() { qDebug() << "About to be destroyed!"; } 
}; 

int main(int argc, char** argv) 
{ 
    QCoreApplication app(argc, argv); 

    Tracker tracker; 

    MyObject *obj = new MyObject(); 
    QObject::connect(obj, SIGNAL(destroyed()), &tracker, SLOT(onDestructor())); 
    delete obj; 

    return app.exec(); 
} 

esso stampa questo:

MyObject constructor 
MyObject destructor 
About to be destroyed! 

Questo comportamento contraddice la documentazione Qt: "Questo segnale viene emesso immediatamente prima l'obj oggetto viene distrutto, e ci riesce non essere bloccato. " Perché succede?

risposta

16

Se si pensa a come il segnale verrà emesso, viene eseguito dal QObject di base: in questo modo QObject sa che viene distrutto.

Così, quando la classe derivata viene distrutta, il distruttore più derivato viene eseguito per primo (secondo la gestione standard degli operatori di C++) e viene visualizzato il messaggio "MyObject destructor". Una volta completato il compito, i dispositivi di protezione di base si attivano e in questo caso si tratta del tag QObject, che quindi emette il segnale e viene visualizzato il messaggio "About to be destroyed!".

La formulazione nei documenti che hai menzionato potrebbe essere un po 'imprecisa. Potrebbe essere meglio formulato con qualcosa come "Questo segnale viene emesso quando l'oggetto è distrutto" o "Questo segnale viene emesso immediatamente prima che l'oggetto sia completamente distrutto".

Problemi correlati