मैं वर्तमान में ओपनजीएल के साथ निचले स्तर के कोडिंग के लिए सी ++ में खुद को प्राप्त कर रहा हूं। मैं एक भारी objc पृष्ठभूमि से आया है इसलिए मुझे स्मृति प्रबंधन के बारे में कुछ समझ है लेकिन मुझे लगता है कि "बूस्ट" लाइब्रेरी ptr_vector
जैसे कंटेनर प्रकारों का प्रबंधन कैसे करती है।ptr_vector स्मृति का प्रबंधन कैसे करता है?
मुझे लगता है कि मेरी समस्या इस तथ्य से संबंधित है कि मुझे नहीं पता कि ptr_vector
अपने और अपने वस्तुओं के विनाश का प्रबंधन कैसे करता है।
कृपया निम्नलिखित कोड पर एक नज़र डालें:
// Header file
...
ptr_vector<IObject3D> objects;
...
// Implementation file
...
void ApplicationEngine::init()
{
WavefrontObject3D *object = new WavefrontObject3D("Ninja.obj");
objects.push_back(object);
}
...
तो, वास्तव में सवाल के लिए: मैं "वस्तु" चर के माध्यम से यहां एक रिसाव बनाने रहा हूँ?
मैं बनाए रखने और ObjC में स्पष्ट कॉल के साथ मैन्युअल रूप से मेरी वस्तुओं जारी करने के लिए प्रयोग किया जाता है: पहले मैं WavefrontObject3D object
alloc init
था, एक सरणी में जोड़ने और बाद में release
कि एक ही वस्तु लीक से बचने के लिए।
लेकिन जब मैं delete object
जोड़ता हूं तो push_back
के बाद वेवफ़्रंटऑब्जेक्ट 3 डी object
के deconstructor को कॉल किया जाता है। यह मुझे एक संकेत देता है कि ptr_vector
object
चर को बनाए रखता नहीं है। क्या मेरी धारणा सही है?
अतिरिक्त है, लेकिन संबंधित, प्रश्न: मान लीजिए कि मैं युक्त वर्ग ApplicationEngine
नष्ट करने के लिए नहीं चाहिए मैं ptr_vector
या तत्वों यह प्रबंधन करता है पर Deconstructor किसी तरह का कॉल करनी होगी है?
'लेकिन जब मैं पुश_बैक कॉल के बाद एक डिलीट ऑब्जेक्ट जोड़ता हूं तो WavefrontObject3D ऑब्जेक्ट के deconstructor को कॉल किया जाता है। 'वैसे यही है' हटाने 'के लिए बनाया गया है। यह पॉइंटर पॉइंट्स के उदाहरण पर विनाशक को बुलाता है। – Nobody
मुझे लगता है कि आपको [RAII] (http://stackoverflow.com/q/395123/20984) पर पढ़ना चाहिए, जिस तरह से तथाकथित "आधुनिक" सी ++ में अधिकांश मेमोरी प्रबंधन किया जाता है। –
ग्रेट रिसोर्स @ ल्यूकौराइल! वास्तव में जिस तरह से मैं सी ++ से संपर्क करना चाहता था। 'Ptr_vector' की आंतरिक कार्यप्रणाली दिखाने के लिए – polyclick