2012-09-20 13 views
6

क्यूटी दस्तावेज के अनुसार:क्या QObject स्टैक के बीच अंतर करता है और हटाए जाने पर आवंटित बच्चों को ढेर करता है?

QObjects ऑब्जेक्ट पेड़ में स्वयं को व्यवस्थित करते हैं। जब आप एक अन्य ऑब्जेक्ट के साथ QObject बनाते हैं, तो ऑब्जेक्ट स्वचालित रूप से माता-पिता के बच्चों() सूची में स्वयं को जोड़ देगा। माता-पिता ऑब्जेक्ट का स्वामित्व लेता है; यानी, यह अपने बच्चों को विनाशक में स्वचालित रूप से हटा देगा।

मेरे लिए इसका मतलब है कि जब QObject हटाया जा रहा है, तो यह जाता है और यह उन सभी पॉइंटर्स पर हटा देता है जो इसे अपने बच्चों की सूची में संग्रहीत करते हैं।

हालांकि, बच्चों को गतिशील रूप से आवंटित करने के लिए जरूरी नहीं है, और आवंटित वस्तुओं के साथ QObject पेड़ बनाने के लिए यह पूरी तरह से कानूनी है।

मानक विनिर्देशों के मुताबिक, एक पॉइंटर पर कॉलिंग को कॉल करना जो गतिशील रूप से आवंटित ऑब्जेक्ट को इंगित नहीं करता है, अनिश्चित व्यवहार है, जिसके परिणामस्वरूप प्रोग्राम क्रैश में "कुछ भी नहीं" हो सकता है।

आईएमओ यह क्यूओब्जेक्ट के लिए असंभव है, जो क्यूटी कक्षाओं के लगभग पूरे संग्रह की रीढ़ की हड्डी है जो अनिर्धारित व्यवहार उत्पन्न करने वाली किसी चीज पर भरोसा कर सकता है।

तो, क्या QObject स्टैक के बीच अंतर करता है और हटाए जाने पर आवंटित बच्चों को ढेर करता है? और यदि हां, तो वास्तव में कैसे?

उत्तर

9

हालांकि, यह बच्चों के लिए गतिशील रूप से आवंटित किया जाना, और यह पूरी तरह QObject पेड़ के निर्माण के लिए कानूनी है ढेर के साथ वस्तुओं आवंटित आवश्यक नहीं है।

सं QObject::~QObject() देखें:

चेतावनी: सभी बच्चे वस्तुओं नष्ट हो जाती हैं। यदि इनमें से कोई भी ऑब्जेक्ट स्टैक या ग्लोबल पर है, तो जल्दी या बाद में आपका प्रोग्राम क्रैश हो जाएगा।

+2

हां, सभी को पूछने से पहले विनाशक पर एक नज़र डालना चाहिए था ... 10x – dtech

+0

कुछ रोचक संबंधित विषय: ढेर में रूट QObjects आवंटित करें; ढेर पर बाकी सब कुछ (बच्चों) https://stackoverflow.com/questions/19331396/how-does-qt-delete-objects-and-what-is-the-best-way-to-store-qobjects?rq= 1 –

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