2012-11-16 22 views
5

Ive देखा की तरह क्यूटी जीयूआई वाक्य रचना निम्नलिखित हर जगह:नष्ट हो जाएगा() उत्सर्जित किया जाएगा यदि QObject से प्राप्त वर्ग के निर्माता फेंकता है?

myDialog::myDialog(QWidget *parent, Qt::WFlags flags):QDialog(parent, flags) 
{ 
    QPushButton *button = new QPushButton("&Download", this); 
    QVBoxLayout *layout = new QVBoxLayout(this); 
    //something that can throw here 
    layout ->addWidget(button); 
    setLayout(layout); 
} 

मैं हमेशा अगर यह एक अपवाद की स्थिति में रिसाव कर सकते हैं क्योंकि "इस" मैं करने के लिए एक अभिभावक के रूप दे रही हूँ आश्चर्य किया है बटन और लेआउट पूरी तरह से निर्मित नहीं है, इसलिए यह अपने बच्चों को नष्ट नहीं कर सकता है।

मैंने इसे MSVC2010 Qt4.8.3 में आज़माया और ऐसा लगता है जैसे बेस QObject क्लास पूरी तरह से बनाई गई है (जो कि पहले किया जाता है) कन्स्ट्रक्टर में अन्य वस्तुओं को "यह" पास करना ठीक है, वे सही ढंग से नष्ट हो जाएंगे।

मुझे यह गारंटी देने वाले क्यूटी दस्तावेज़ों में जगह नहीं मिली है, क्या कोई मुझे इस पर इंगित कर सकता है, इसलिए मुझे आश्वासन है कि भविष्य में यह नहीं बदलेगा?

उत्तर

2

मेरा मानना ​​है कि यह base constructor is executed prior to derived constructors की गारंटी देने के लिए मानक सी ++ है, हालांकि मैं मानक से अध्याय और कविता का उल्लेख नहीं कर सकता। उस ने कहा, एक गारंटी है कि QObject's destructor हमेशा उस QObject के किसी भी बच्चे को नष्ट कर देगा।

क्यूटी सम्मेलन यह है कि एक क्यूओब्जेक्ट जिसका पॉइंटर एक क्यूओब्जेक्ट या क्यूविजेट कन्स्ट्रक्टर को पास किया जाता है, वह नव निर्मित वस्तु का अभिभावक बन जाएगा। इसलिए, जब आप this से button के सीटीआर पास करते हैं, buttonmyDialog का बच्चा बन जाता है। चूंकि उस समय myDialog का क्यूओब्जेक्ट भाग पहले से ही बनाया जा चुका है, मेरा मानना ​​है कि आप उस कार्यक्षमता पर सुरक्षित रूप से भरोसा कर सकते हैं।

संपादित करें: मैं ऊपर दिए गए उदाहरण में है कि जोड़ना चाहिए, निर्माता जब layout को जोड़ा गया और myDialog का एक भव्य वाले बच्चे हो जाता है, यह reparented हो जाता है, जो अभी भी होना चाहिए की वजह से हालांकि buttonmyDialog के एक बच्चे के रूप में प्रारंभ होता है अपने QObject विनाशक द्वारा हटा दिया गया।

+0

क्यूओब्जेक्ट के विनाशक को नहीं कहा जाएगा यदि मेरा डियालॉग का कन्स्ट्रक्टर फेंकता है। मूल कोड के साथ एक रिसाव होगा। –

+3

मुझे नहीं लगता कि यह सही है। बेस क्लास के विनाशक को अभी भी बुलाया जाना चाहिए। http://stackoverflow.com/questions/3759270/will-the-destructor-of-the-base-class-called-if-an-object-throws-an-exception-in – Phlucious

+0

आप फिर से सही हैं। इंगित करने के लिए धन्यवाद। –