2012-12-03 16 views
11

संभव डुप्लिकेट करने के लिए:
How to release std::vector if there is no heap memoryकैसे ठीक से C++ वैक्टर की वेक्टर को नष्ट करने और जारी स्मृति

C++ noob यहाँ

मान लीजिए मैं की तरह वैक्टर का एक वेक्टर की घोषणा:

vector<vector<vector<double> > > phi_x; 

मेरे द्वारा इसका उपयोग करने के बाद, मैं इसे मुक्त करने के लिए इसे कैसे नष्ट कर सकता हूं?

मैंने कुछ अन्य साइटें पढ़ी हैं और वे .clear() का उपयोग करने की सलाह देते हैं। मेरी समझ से, यह केवल तत्वों को हटा देता है लेकिन वेक्टर क्षमता जारी नहीं होती है। मैं चाहता हूं कि वेक्टर पूरी तरह से भुलाया जाए जैसे कि यह अस्तित्व में नहीं था।

इसके अलावा, वेक्टर के मेरे वर्तमान अनुप्रयोग में 54x54x9 के आयाम हैं और मुझे इनमें से लगभग 12 चीजें मिली हैं। क्या वह बेवकूफ रूप से बड़ा माना जाता है?

+0

लेकिन यह वैक्टरों के वैक्टरों का एक वेक्टर है, यह एक बहुत ही अलग सवाल है – thecoshman

उत्तर

7

आपको कुछ भी करने की ज़रूरत नहीं है। बस चर को दायरे से बाहर जाने दें।

+0

मैं देखता हूं लेकिन वेक्टर को स्मृति आवंटन निम्न कोड के चलते धीमे कोड को धीमा कर देता है। –

+0

@KeenanZ यह असंभव है। देखने के लिए अपना कोड प्रोफाइल करें। किसी भी तरह से, आप बस प्रत्येक वेक्टर उपयोग के आसपास एक नेस्टेड ब्लॉक स्कोप जोड़ सकते हैं। –

0

यदि आपके phi_x वैरिएबल कुछ ब्लॉक के अंदर कुछ स्थानीय चर है, तो इसे ब्लॉक के अंत में अपने विनाशक के रूप में नष्ट कर दिया जाएगा।

यदि यह वैश्विक चर है, तो यह main समाप्त होने के बाद नष्ट हो जाएगा।

2

मेरे द्वारा इसका उपयोग करने के बाद, मैं इसे मुक्त करने के लिए इसे कैसे नष्ट कर सकता हूं?

बस इसे दायरे से बाहर जाने दें।

वेक्टर के मेरे वर्तमान अनुप्रयोग में 54x54x9 के आयाम हैं और मुझे इनमें से लगभग 12 चीजें मिली हैं। क्या वह बेवकूफ रूप से बड़ा माना जाता है?

यह निर्भर करता है। यदि यह 64k मेमोरी के साथ एम्बेडेड प्लेटफार्म के लिए है, तो हाँ, यह बड़ा है। यदि यह मानक डेस्कटॉप पीसी के लिए है, तो 4 जी + रैम के साथ, इसे उपेक्षित किया जा सकता है।

7

यदि आप .clear() पर कॉल करते हैं, तो आंतरिक वैक्टर पूरी तरह नष्ट हो जाएंगे। हालांकि, बाहरीतम वेक्टर स्मृति की अपनी सरणी (phi_x.size() * sizeof(vector<vector<double> >) बाइट्स) के लिए उपयोग की गई स्मृति को बरकरार रख सकता है। पूरी तरह से स्पष्ट है कि यह और एक खाली वेक्टर के साथ सभी स्मृति, स्वैप जारी करने के लिए:

phi_x.swap(vector<vector<vector<double> > >()); 

या बस phi_x क्षेत्र से बाहर चलते हैं।

+0

स्पष्ट रूप से समाशोधन मदद करता है –

0

यदि आपके वेक्टर द्वारा दिखाए गए इस वेक्टर को कोई अतिरिक्त सफाई करने की आवश्यकता नहीं है, तो जैसे ही यह गुंजाइश से बाहर हो जाता है, स्मृति को ठीक से नष्ट कर दिया जाएगा।

यह जल्द ही समारोह के रूप में घोषित किया जाएगा या यदि ऑब्जेक्ट में रहता है तो यह नष्ट हो जाएगा।

0

विनाशक आपके लिए सफाई का काम करेगा। आपको कुछ भी करने की ज़रूरत नहीं है लेकिन phi_x को दायरे से बाहर जाने दें।

{ 
    vector<vector<vector<double> > > phi_x; 

    // do stuff with phi_x 
} 
// phi_x is gone here 
1

आपको कुछ भी करने की ज़रूरत नहीं है, विनाशक ठीक से साफ हो जाएगा।

यदि आप स्कोप से बाहर होने से पहले स्मृति उपयोग को मुक्त करना चाहते हैं तो आप शीर्ष स्तर पर साफ़ कर सकते हैं। यह शीर्ष वेक्टर द्वारा उपयोग की जाने वाली स्मृति को पुन: आवंटित नहीं करेगा लेकिन यह सभी निहित वैक्टरों को हटा देगा और वे अपनी याददाश्त में अपनी याददाश्त जारी करेंगे।

यदि मैं इसे सही तरीके से गणना करता हूं तो यह लगभग 1 मिलियन तत्वों का दोगुना होता है। एक आधुनिक पीसी को ऐसे मंच के रूप में मानना ​​जो बेवकूफ नहीं है। या यहां तक ​​कि बहुत बड़ा :)