2011-12-30 49 views
6

Hãy xem xét trường hợp thử nghiệm này:Tại sao tín hiệu QObject bị phá hủy được gọi là SAU sự hủy diệt?

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

It in này:

MyObject constructor 
MyObject destructor 
About to be destroyed! 

Hành vi này mâu thuẫn với tài liệu Qt: "Tín hiệu này được phát ra ngay lập tức trước đối tượng obj bị phá hủy, và có thể không bị chặn. " Tại sao điều này xảy ra?

Trả lời

16

Nếu bạn suy nghĩ về cách tín hiệu sẽ được phát ra, nó được thực hiện bởi các QObject cơ sở - đó là cách QObject biết nó bị phá hủy.

Vì vậy, khi lớp dẫn xuất bị hủy, trình phá hủy có nguồn gốc nhiều nhất được chạy đầu tiên (trên mỗi xử lý C++ tiêu chuẩn C++) và thông báo "MyObject destructor" được hiển thị. Khi dtor đó hoàn thành, các dtors cơ sở được chạy và trong trường hợp này là dtor QObject, sau đó phát ra tín hiệu và thông báo "About to be destroyed!" được hiển thị.

Các từ ngữ trong các tài liệu mà bạn đề cập có thể là một chút không chính xác. Nó có thể được tốt hơn worded với một cái gì đó như, "Tín hiệu này được phát ra như là obj đối tượng bị phá hủy" hoặc "Tín hiệu này được phát ra ngay lập tức trước khi đối tượng obj là hoàn toàn bị phá hủy".

Các vấn đề liên quan