2011-12-30 12 views
6

Rozważmy następujący przypadek testowy:Dlaczego QObject niszczy sygnał o nazwie PO Zniszczeniu?

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(); 
} 

Drukuje to:

MyObject constructor 
MyObject destructor 
About to be destroyed! 

Takie zachowanie jest sprzeczne z dokumentacją Qt: „Ten sygnał jest emitowany natychmiast przed należy OBJ przedmiot zostaje zniszczony, a może nie być zablokowanym. " Dlaczego tak się dzieje?

Odpowiedz

16

Jeśli myślisz o tym, jak sygnał zostanie wyemitowany, robi to bazowy QObject - w ten sposób QObject wie, że jest on niszczony.

Kiedy klasa pochodna zostanie zniszczona, najbardziej wyprowadzony destruktor zostaje uruchomiony jako pierwszy (zgodnie ze standardową obsługą języka C++), a następnie wyświetlany jest komunikat "MyObject destructor". Kiedy ten dtor się zakończy, podstawowy dres zostanie uruchomiony, w tym przypadku jest to QObject dtor, który następnie emituje sygnał i wyświetla się komunikat "About to be destroyed!".

Sformułowanie w wymienionych dokumentach może być nieco nieprecyzyjne. Może to być lepiej sformułowane z czymś w rodzaju: "Ten sygnał jest emitowany, gdy obiekt obj jest zniszczony" lub "Ten sygnał jest emitowany bezpośrednio przed całkowitym zniszczeniem obiektu obj".

Powiązane problemy