2011-12-30 10 views
6

इस परीक्षण मामले पर विचार करें:क्यूओब्जेक्ट विनाश के बाद बुलाए गए सिग्नल को क्यों नष्ट कर दिया गया है?

MyObject constructor 
MyObject destructor 
About to be destroyed! 

यह व्यवहार क्यूटी प्रलेखन के विपरीत है: "यह संकेत तुरंत उत्सर्जित होता है से पहले वस्तु obj नष्ट हो जाता है, और यह कर सकते हैं

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

यह इस प्रिंट अवरुद्ध नहीं किया जाएगा। " ऐसा क्यों होता है?

उत्तर

16

यदि आप सोचते हैं कि सिग्नल कैसे निकलता है, तो यह आधार QObject द्वारा किया जाता है - इस तरह QObject जानता है कि इसे नष्ट किया जा रहा है।

तो जब व्युत्पन्न वर्ग नष्ट हो जाता है, तो सबसे व्युत्पन्न विनाशक पहले (प्रति मानक सी ++ डॉटर हैंडलिंग) चलाता है, और "MyObject destructor" संदेश प्रदर्शित होता है। जब वह डॉटोर पूरा हो जाता है, बेस डॉटर्स दौड़ते हैं और इस मामले में यह QObject dtor है, जो सिग्नल को उत्सर्जित करता है और "About to be destroyed!" संदेश प्रदर्शित होता है।

आपके द्वारा उल्लिखित दस्तावेज़ों में शब्द थोड़ा अपरिचित हो सकता है। यह कुछ बेहतर तरीके से लिखा जा सकता है, "यह सिग्नल उत्सर्जित होता है क्योंकि ऑब्जेक्ट obj नष्ट हो जाता है" या "ऑब्जेक्ट obj पूरी तरह से नष्ट होने से ठीक पहले यह सिग्नल उत्सर्जित होता है"।

संबंधित मुद्दे