2012-11-23 21 views
5

मैं जानता हूँ कि क्यूटी स्मृति प्रबंधन के बारे में सवाल का एक बहुत देखते हैं, लेकिन मैं मेरा कोई ऐसा उत्तर नहीं मिल सका।क्यूटी मेमोरी मैनेजमेंट वस्तुओं

तो क्यूटी विजेट के लिए, अगर आप इस पारित (जो माता-पिता विजेट है) ऑब्जेक्ट निर्माण में पैरामीटर के रूप में, माता पिता विजेट यह के स्वामित्व लेता है और इसे हटा देता है जब माता-पिता मर जाता है। वही बात होती है जब आप किसी लेआउट में विजेट जोड़ते हैं और विजेट पर वह लेआउट सेट करते हैं।

लेकिन क्या होता अगर मैं उदाहरण के लिए एक Qcolor वस्तु के लिए एक सूचक की घोषणा? QColor को किसी अन्य विजेट के लिए बच्चे के रूप में नहीं जोड़ा जा सकता है या लेआउट में जोड़ा नहीं जा सकता है। जब विजेट मर जाता है या मुझे विनाशक में इसे मैन्युअल रूप से हटाने की आवश्यकता होती है तो क्या स्मृति जारी की जाएगी?

एक उदाहरण यहाँ ... क्या m_pColor साथ होता है जब विजेट नष्ट हो जाएगा? क्या यह नष्ट हो जाएगा या एक स्मृति रिसाव होगी? कोड में किसी भी गलती के लिए क्षमा करें, मैं इसे संकलित नहीं किया था, मैं सिर्फ इसे यहाँ लिखा उदाहरण के रूप में।

#ifndef WIDGET_H 
#define WIDGET_H 

#include <QWidget> 

class QHBoxLayout; 
class QPushButton; 
class QColor; 

class Widget : public QWidget 
{ 
    Q_OBJECT 

public: 
    Widget(QWidget *parent = NULL); 

public: 
    QHBoxLayout *m_pLayout; 
    QPushButton *m_pButton; 
    QColor *m_pColor; 
}; 

#endif // WIDGET_H 

#include "widget.h" 

#include <QHBoxLayout> 
#include <QPushButton> 
#include <QColor> 

Widget::Widget(QWidget *parent) 
    : QWidget(parent) 
{ 
    m_pLayout = new QHBoxLayout; 
    m_pButton = new QPushButton(tr("Button")); 
    m_pLayout->addWidget(m_pButton); 

    m_pColor = new QColor(0, 0, 0, 255); 

    setLayout(m_pLayout); 
} 

उत्तर

6

आप क्या सुझाव केवल QObject इनहेरिट वर्गों (यानी QObject उनके सुपर क्लास में से एक के रूप में होने) के लिए मान्य है। ये गुण अन्य वर्गों पर भी लागू नहीं होते हैं (यहां तक ​​कि निर्मित Qt)। QColorQObject की नहीं एक उपवर्ग के रूप में, जब Widget नष्ट हो जाता है वस्तु m_pColor द्वारा संदर्भित नष्ट नहीं किया जाएगा। आपको इसे मैन्युअल रूप से करना होगा।

2

माता पिता विजेट m_pColor को नष्ट करने के लिए कोई संदर्भ नहीं है। आप इस निष्पादन योग्य पर स्मृति रिसाव की जांच के लिए वालग्रिंड का उपयोग कर सकते हैं।

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