2009-04-25 13 views
5

आपको क्या लगता है? क्या यह सही है या मेमोरी लीक हैं?क्यूलिस्ट और साझा_ptr

स्रोत:

#include <QList.h> 
#include <boost/shared_ptr.hpp> 
#include <iostream> 

class A { 
private: 
    int m_data; 
public: 
    A(int value=0) { m_data = value; } 
    ~A() { std::cout << "destroying A(" << m_data << ")" << std::endl; } 
    operator int() const { return m_data; } 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    QList<boost::shared_ptr<A> > list; 
    list.append(boost::shared_ptr<A>(new A(6))); 
    std::cout << int(*(list.at(0))) << std::endl; 
    return 0; 
} 

आउटपुट:

6 
destroying A(6) 
+2

एक sidenote के रूप: 'QList का उपयोग नहीं करते' जहां 'sizeof (टी)> sizeof (शून्य *)' (और 'sizeof (shared_ptr ) == 2 * sizof (शून्य *)', आमतौर पर), चूंकि उस मामले में 'क्यूलिस्ट' सूची में तत्वों की प्रतिलिपि बनायेगा (जैसा मूल्य के आधार पर इसे पकड़ने के विपरीत)। इसके बजाए 'क्यूवेक्टर' या 'std :: वेक्टर' का प्रयोग करें। –

उत्तर

1

यह सही लगता है। बूस्ट का shared_ptr एक संदर्भ गिनती सूचक है। ऑब्जेक्ट्स के बीच कोई परिपत्र संदर्भ नहीं होने पर संदर्भ गिनती स्मृति को पुनः प्राप्त करने में सक्षम है। आपके मामले में, कक्षा ए की वस्तुएं किसी अन्य वस्तु का संदर्भ नहीं देती हैं। इस प्रकार, आप चिंताओं के बिना shared_ptr का उपयोग कर सकते हैं। साथ ही, स्वामित्व अर्थशास्त्र एसटीएल (और क्यूटी) कंटेनरों में साझा_ptrs का उपयोग करने की अनुमति देता है।

1

यह जानते हुए भी क्यों A वस्तुओं की shared_ptr रों की सूची पहली जगह में मौजूद के बिना कुछ भी सुझाव देने के लिए मुश्किल है।

स्मार्ट पॉइंटर्स के ownership semantics पर एक नज़र डालें। शायद आपकी मदद करो।

कुछ अन्य चीजें हैं जो सुधार किया जा सकता:

1. उपयोग प्रारंभकर्ता सूचियों ctor में की तरह:

class A { 
private: 
    int m_data; 
public: 
    A(int value=0) : m_data (value) {} 
// .... 

2.int _tmain(int argc, _TCHAR* argv[]) एक स्टैंडर्ड हस्ताक्षर नहीं है,

उपयोग

int main(int argc, char* argv[]) 

या बस:

int main() 
+0

मुझे यकीन नहीं है कि आपके पहले बिंदु के साथ आपका क्या मतलब है। मुझे प्रारंभकर्ता सूचियों का उपयोग कहां करना चाहिए? विजुअल स्टूडियो विज़ार्ड का उपयोग करते समय '_tmain' डिफ़ॉल्ट था लेकिन उस संकेत के लिए धन्यवाद! – WolfgangA

+1

_tmain (int argc, _TCHAR * argv []) वीसी ++ पर मान्य हस्ताक्षर है :)। यह एक मुख्य विधि है जो वीएस में स्विच के आधार पर मल्टीबाइट या यूनिकोड तर्क लेती है। एक int wmain (int argc, wchar_t * argv []) भी है। – Skurmedel

+0

एक कार्यान्वयन मुख्य के एन अलग-अलग हस्ताक्षर प्रदान कर सकता है। भाषा मानक केवल दो परिभाषित करता है (मैंने उपर्युक्त उल्लेख किया है)। – dirkgently

1

इस कोड को पूरी तरह से ठीक लग रहा है।

यदि आप सलाह चाहते हैं तो शायद आप QList के साथ shared_ptr का उपयोग करने के उद्देश्य से अधिक जानकारी प्रदान कर सकते हैं, तो साझा_प्टर जैसे बड़ी बंदूकें खींचने के बिना ऐसा करने का "क्यूटी" तरीका हो सकता है।

+1

जो पूरी तरह से सही नहीं है। आप QT के ऑब्जेक्ट स्वामित्व वाले पेड़ को लेआउट की तरह उपयोग कर सकते हैं, QList को उस ऑब्जेक्ट के प्रत्येक ऑब्जेक्ट के स्वामी के रूप में पास कर सकते हैं। क्यूटी के साथ काम करते समय यह एक बहुत ही उपयोगी तकनीक है। इसके बारे में यहां और पढ़ें: http://doc.trolltech.com/4.5/objecttrees.html –

+0

@ डैनियल यह एक विकल्प नहीं है, क्योंकि माता-पिता और बच्चों को काम करने के लिए क्यूब्जेक्ट उप-वर्ग होना चाहिए। QList एक QObject नहीं है, इसलिए यदि कोई QObject से विरासत में मिला है तो यह कोई नहीं है। –

1

यदि आप स्मार्ट पॉइंटर का उपयोग नहीं कर रहे हैं, तो आपको अपने द्वारा सूची तत्वों को हटाना होगा।

स्रोत:

#include <QList.h> 
#include <boost/shared_ptr.hpp> 
#include <iostream> 

class A { 
private: 
    int m_data; 
public: 
    A(int value=0) { m_data = value; } 
    ~A() { std::cout << "destroying A(" << m_data << ")" << std::endl; } 
    operator int() const { return m_data; } 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    QList<A *> list; 
    list.append(new A(6)); 
    std::cout << int(*(list.at(0))) << std::endl; 
    return 0; 
} 

आउटपुट:

6 

अच्छा नहीं।

+0

फिर केवल "नया" ऑपरेटर हटा दें और QList होने पर ए ऑब्जेक्ट को डिज़ाइन किया जाएगा। –

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