Qt

2010-03-03 11 views
5

में विगेट्स के संग्रह के लिए मेमोरी प्रबंधन बेवकूफ सवाल के लिए खेद है, लेकिन मैं पहली बार क्यूटी और सी ++ के साथ काम कर रहा हूं, और ट्यूटोरियल और कुछ नमूने के माध्यम से काम कर रहा हूं।Qt

एक बात का उल्लेख किया गया था कि क्यूटी सामान को स्पष्ट रूप से हटाया जाना आवश्यक नहीं है। तो, मुख्य प्रश्न, क्या यह क्यूटी सामग्री के संग्रह पर भी लागू होता है? जैसे कि मुझे MyWidget एस की गतिशील संख्या चाहिए, इसलिए मैं vector या उनमें से कुछ भी रखता हूं। क्या वे अभी भी मेरे लिए ख्याल रखते हैं?

एक साइड सवाल के रूप में, इसे बनाने के लिए क्या चल रहा है इसलिए मुझे विनाशकों के बारे में चिंता करने की ज़रूरत नहीं है?

उत्तर

5

क्यूटी के लिए निश्चित रूप से एक दिलचस्प ऑब्जेक्ट मॉडल है। जब मैंने पहली बार शुरू किया तो मुझे यह असहज बना दिया कि new Foo कॉल और delete एस नहीं थे।

http://qt.nokia.com/doc/4.6/object.html ऑब्जेक्ट मॉडल पर पढ़ने शुरू करने के लिए एक अच्छी जगह है।

ब्याज की चीजें: क्यूओब्जेक्ट उप-वर्गों में उनके असाइनमेंट और कॉपी-सीटीआर विधियां अक्षम हैं। ऑब्जेक्ट बाल-माता-पिता की श्रृंखला QObject द्वारा आंतरिक रूप से बनाए रखा जाता है।

आम तौर पर जब एक क्यूओब्जेक्ट सबक्लास (यदि आप अपने पॉइंटर को प्रबंधित करने की योजना नहीं बनाते हैं) तो आप माता-पिता के रूप में एक और QObject सूचक प्रदान करेंगे। यह 'अभिभावक' तब आपके द्वारा बनाए गए बच्चे के प्रबंधन को लेता है। आप इसे सेट करने के लिए "Qsbject" पर सेटपैरेंट() को कॉल कर सकते हैं। क्यूटी में बहुत कम विधियां हैं जो किसी ऑब्जेक्ट के पैरेंट को बदल देगी, और वे सभी स्पष्ट रूप से बताते हैं कि वे दस्तावेज़ों में करते हैं।

तो अपने विशिष्ट प्रश्न का उत्तर देने के लिए: यह इस बात पर निर्भर करता है कि आपने अपने सभी MyWidget उदाहरण कैसे बनाए हैं।

यदि आपने प्रत्येक को माता-पिता के साथ बनाया है, तो आपको उन्हें हटाने की आवश्यकता नहीं है। हटाए जाने पर माता-पिता उन्हें हटा देंगे।

यदि आप QList<MyWidget*> संग्रह एकत्र कर रहे हैं, और आपने उन्हें माता-पिता नहीं दिया है, तो आपको उन्हें स्वयं हटा देना चाहिए।

7

क्यूटी मेमोरी प्रबंधन मॉडल माता-पिता के संबंधों पर आधारित है। क्यूटी कक्षाएं उनके कन्स्ट्रक्टर के पैरामीटर के रूप में एक वैकल्पिक parent लेती हैं। नया उदाहरण इस अभिभावक के साथ पंजीकृत है कि जब माता-पिता हटा दिया जाता है तो इसे हटा दिया जाता है। यदि आप एक क्यूटी संग्रह (उदा। QList) का उपयोग कर रहे हैं, तो मेरा मानना ​​है कि आप सूची को अपनी प्रविष्टियों के अभिभावक के रूप में सेट कर सकते हैं। यदि आप एक std :: वेक्टर या अन्य संग्रह प्रकार का उपयोग कर रहे हैं, तो आपको "स्वचालित" स्मृति प्रबंधन नहीं मिलेगा।

क्यूटी मॉडल यूआई पदानुक्रम में बहुत अधिक समझ में आता है जहां यह यूआई पदानुक्रम के साथ एक-से-एक से मेल खाता है। अन्य मामलों में, यह हमेशा साफ रूप से मानचित्रण नहीं करता है और आपको मूल्यांकन करना होगा कि क्यूटी प्रणाली का उपयोग करना विशेष स्थिति के लिए समझ में आता है या नहीं। सामान्य सी ++ उपकरण अभी भी काम करते हैं: आप ऑब्जेक्ट आजीवन प्रबंधन में सहायता के लिए std :: tr1 :: shared_ptr या किसी अन्य स्मार्ट पॉइंटर क्लासेस का उपयोग कर सकते हैं। क्यूटी में QPointer, एक संरक्षित सूचक, और QSharedPointer/QWeakPointer जोड़ी शामिल है जो संदर्भ-कोटिंग स्मार्ट पॉइंटर और कमजोर-संदर्भ जोड़ी को लागू करती है।

+2

आप एक वस्तु के अभिभावक के रूप में एक क्यूटी संग्रह सेट नहीं कर सकते हैं। वस्तुओं को गतिशील रूप से आवंटित किया गया है और माता-पिता के संबंध हैं QObjects हैं, और वे माता-पिता के रूप में QObjects/QWidgets उप-वर्ग लेते हैं। क्यूलिस्ट और अन्य संग्रह वर्ग QWidget (और एक्सटेंशन QObject द्वारा) का उत्तराधिकारी नहीं है, इसलिए आप इसे माता-पिता के रूप में सेट नहीं कर सकते हैं। – blwy10

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