2010-02-04 14 views
5

मैं काफी मजबूत सी पृष्ठभूमि से आया हूं, और सी ++ में एक ठोस नींव है। हाल ही में मैं सी # और अन्य उच्च स्तरीय भाषाओं के साथ काम कर रहा हूं। एक परियोजना जिस पर मैं काम कर रहा हूं, वास्तव में क्यूटी 4 का उपयोग करने से लाभ उठा सकता है, लेकिन मेरे पास मेमोरी मैनेजमेंट पर कुछ प्रश्न हैं जो मुझे समझ में नहीं आ रहा है। मैंने क्यूटी 4 दस्तावेज पढ़ा है और इससे मुझे बहुत मदद नहीं मिली है। इसलिए मैं यहाँ हूँ।क्यूटी 4 मेमोरी मैनेजमेंट

1) ठीक है तो साथ, मैं समझता हूँ कि सबसे आसान तरीका है QT4 वस्तुओं का उपयोग करने के लिए उन्हें स्थानीय स्तर पर घोषित करने के लिए है शुरू करने के लिए:,

void MyFunc() 
{ 
    QString foo; 
    // do stuff to foo 

} 

यह काफी सरल है, मैं उस वस्तु ले जा सकते हैं और इसके आसपास पारित और जानते हैं कि जब यह गुंजाइश से बाहर हो जाता है तो यह नष्ट हो जाएगा। लेकिन यह मेरा सवाल है।

1) यदि मैं एक क्यूलिस्ट बनाता हूं और इसमें वस्तुओं को जोड़ता हूं, और फिर QList गुंजाइश से बाहर हो जाता है, तो क्या यह बच्चे की वस्तुओं को रद्द करने का प्रयास करेगा?

2) यदि कोई क्यूटी 4 दिनचर्या किसी ऑब्जेक्ट को पॉइंटर देता है, तो क्या मैं उस ऑब्जेक्ट के डी-आवंटन के लिए ज़िम्मेदार हूं?

3) यदि मैं एक QWidget का उप-वर्ग बना देता हूं, और इसे QWindow में जोड़ता हूं, तो मैं कैसे बीमा करूं कि QWindow नष्ट हो जाने पर, यह मेरे विजेट को इसके साथ लेता है?

सहायता के लिए धन्यवाद।

+0

आपके कुछ उत्तर ऑब्जेक्ट स्वामित्व दस्तावेज़ में हैं: http://cep.xor.aps.anl.gov/software/qt4-x11-4.2.2/objecttrees.html। –

उत्तर

13

अगर मैं एक QList बना सकते हैं और इसे करने के लिए वस्तुओं जोड़ने के लिए, और उसके बाद QList क्षेत्र से बाहर चला जाता है, यह बच्चे वस्तुओं पुनःआवंटन करने की कोशिश करेंगे?

QList बस std :: सूची की तरह है। यह नष्ट होने पर निहित वस्तुओं को नष्ट कर देगा।

यदि कोई क्यूटी 4 दिनचर्या किसी ऑब्जेक्ट को पॉइंटर लौटाती है, तो क्या मैं उस ऑब्जेक्ट के डी-आवंटन के लिए ज़िम्मेदार हूं?

आमतौर पर, दस्तावेज़ों को यह निर्दिष्ट करना चाहिए कि क्या होता है। एक अपवाद लेते हैं * फ़ंक्शंस (उदा: QTableWidget :: takeItem)।

यदि मैं एक QWidget का उप-वर्ग बनाता हूं, और इसे एक QWindow में जोड़ता हूं, तो मैं कैसे बीमा करूं कि QWindow नष्ट हो जाने पर, यह मेरे विजेट को इसके साथ लेता है?

यह इस बात पर निर्भर करता है कि आप सबक्लास ऑब्जेक्ट कैसे बनाते हैं।

  • आप इसे विंडो विजेट के सदस्य के रूप में जोड़ सकते हैं (रास्ते में कोई क्यूविंडो नहीं है) और यह किसी भी सदस्य चर की तरह नष्ट हो जाएगा।
  • आप इसे नए के साथ आवंटित कर सकते हैं और इसे विंडो को मूल के रूप में पास कर सकते हैं और इसे हटाया जाएगा क्यूटी ऑब्जेक्ट ट्री कार्यान्वयन के लिए धन्यवाद (केक के रूप में)
  • आप मेमोरी प्रबंधन स्वयं कर सकते हैं।

जब एक QWidget (या किसी भी QObject) नष्ट हो जाता है, यह अपने आप में अपने माता-पिता के लिए हटाना रद्द करें सूची से हटाने ताकि आप इसे अपने आप को नष्ट कर सकते हैं और डबल हटाए गए के बारे में चिंता नहीं होगी।

1

उत्तर क्यूटी में मौजूद माता-पिता/बाल वस्तु संबंध है। जब कोई मूल वस्तु दायरे से बाहर हो जाती है, या किसी अन्य माध्यम से नष्ट हो जाती है, तो क्यूटी यह सुनिश्चित करता है कि उसके सभी बच्चे की वस्तुओं को नष्ट कर दिया जाए। इस व्यवहार के बारे

अधिक यहां पाया जा सकता ->http://doc.trolltech.com/4.4/objecttrees.html

2

आप यहां से शुरू करना चाहेंगे: Object Trees क्योंकि यह माता-पिता/बाल संबंध Qt का उपयोग करता है (और अब तक दिए गए सभी अन्य लिंक पुराने या तृतीय पक्ष हैं)।

1) यदि मैं एक क्यूलिस्ट बनाता हूं और इसमें वस्तुओं को जोड़ता हूं, और फिर QList गुंजाइश से बाहर हो जाता है, तो क्या यह बच्चे की वस्तुओं को रद्द करने का प्रयास करेगा?

हां, यह std :: सूची की तरह व्यवहार करता है। बस std :: सूची की तरह, यह केवल हटाएगा हटाएगा। यह वह जगह है जहां Qt pointer classes से कुछ) काम

2 में आते हैं एक QT4 दिनचर्या एक वस्तु के लिए सूचक देता है, तो मैं तो उस वस्तु की de-आवंटन के लिए जिम्मेदार हूँ?

जैसा कि आरपीजी ने कहा, आमतौर पर नहीं, लेकिन यदि आप दस्तावेज हैं तो ऐसा कहेंगे।

3) अगर मैं एक QWidget का एक उपवर्ग बनाते हैं, और एक QWindow में जोड़ने, मैं कैसे बीमा है कि जब QWindow नष्ट हो जाता है, कि यह मेरी विजेट इसके साथ ले जाता हो?

जब आप अपना सबक्लास बनाते हैं, तो ctor में पैरेंट पैरामीटर का उपयोग करना सुनिश्चित करें। इस तरह वस्तु क्यूटी द्वारा हटा दी जाएगी। यदि आवश्यक हो, तो आप माता-पिता को QObject::setParent (QObject * parent) के साथ सेट कर सकते हैं।

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