2013-10-12 19 views
13

को साफ़ करने के बाद मेमोरी समस्याएं मुझे एहसास हुआ कि वेक्टर.क्लर() को साझा करने वाले पॉइंटर्स को कॉल करने के बाद, shared_ptr द्वारा ऑब्जेक्ट के विनाशक को रिहा नहीं किया जा रहा है।साझा पॉइंटर्स के वेक्टर, वेक्टर

कोड उदाहरण नीचे देखा जा सकता है। यहां तक ​​कि vector.clear() भी कहा जा रहा है, साझा पॉइंटर के बाद नामक विनाशक गुंजाइश से परे चला जाता है। मेरा सवाल है कि उन्हें वेक्टर के अंदर मैन्युअल रूप से वेक्टर के अंदर सभी स्मार्ट पॉइंटर्स को हटाना होगा? क्या कोई आसान तरीका है जिसे आप सलाह दे सकते हैं?

Output : 

constructor 
I am here 
destructor 

Code: 

#include <vector> 
#include <iostream> 
#include <memory> 

using namespace std; 

class A 
{ 
public: 
    A(){cout << "constructor" << endl;}; 
    ~A(){cout << "destructor" << endl;}; 
}; 

int main() 
{ 
    shared_ptr<A> sharedptr (new A); 
    std::vector<shared_ptr<A> > test; 
    test.push_back(sharedptr); 

    test.clear(); 
    cout << "I am here" << endl; 
} 

उत्तर

23

आप इस मामले में shared_ptr<A> की दो प्रतियां है, एक sharedptr चर और वेक्टर में एक तत्व के रूप में अन्य है।

इस बजाय

test.push_back(std::move(sharedptr)); 

टिप्पणी करना अब मूल sharedptr यह आंतरिक चले गए और अब प्रयोग करने योग्य है है। दूसरी बात यह नहीं है कि यह कुछ भी नहीं करता है, यह shared_ptr का एक पूरी तरह से वैध उपयोग है और sharedptr दायरे से बाहर होने के बाद स्वयं को साफ़ कर देगा।

+0

आपका उत्तर वही है जो मैं ढूंढ रहा था। बहुत बहुत धन्यवाद। –

+0

मैं जोड़ता हूं कि प्रश्न में दिखाए गए मामले में, मैं वास्तव में वेक्टर में 'emplace_back' के माध्यम से वेक्टर में जगह बनाना पसंद करूंगा, ताकि एक सुलभ नामित चर ('shareptr') से बचने के लिए जिसका उपयोग खतरनाक होगा 'std :: move'। – us2012

4

समस्या तब उत्पन्न होती है जब push_back को वेक्टर में shared_ptr की प्रतिलिपि बनाता है, जो मुख्य अस्तित्व तक मूल लटकती है। यदि आप मुख्य दायरे में shared_ptr नहीं बनाते हैं, तो समस्या नहीं होती है। मुख्य क्षेत्र में share_ptr बनाने से बचें। इसे push_back कॉल में अस्थायी अधिकार के रूप में बनाएं।

Output is now: 

constructor 
I am almost there 
destructor 
I am here 

New code: 

#include <vector> 
#include <iostream> 
#include <memory> 

using namespace std; 

class A 
{ 
public: 
    A(){cout << "constructor" << endl;}; 
    ~A(){cout << "destructor" << endl;}; 
}; 

int main() 
{ 
    vector<shared_ptr<A> > test; 
    test.push_back(shared_ptr<A>(new A)); 
    cout << "I am almost there" << endl; 
    test.clear(); 
    cout << "I am here" << endl; 
    return 0; 
} 
+0

maked_shared या emplace_back के बारे में क्या? – GameDeveloper

2
यहाँ

sharedptr और वेक्टर शेयर एक ही वस्तु है जो केवल एक बार निर्माता और नाशक लागू का परिणाम देगा में तत्व।

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