c++ - Freeing heap pointers stored in std::queue -
इस कोड पर विचार करें:
class Foo; एसटीडी: कतार & LT; फू * & gt; क्ष; // आवंटित करें और कतार में ऑब्जेक्ट्स को जोड़ (इंट आई = 0; आई & lt; 100000; i ++) {Foo * f = new Foo (); q.push (च); } // कतार से ऑब्जेक्ट्स निकालें और उन्हें निःशुल्क करें (जबकि! Q.empty ()) {Foo * f2 = q.front ()); q.pop (); F2 हटाएं; }
एकल चरण से मैं फू डिस्ट्रक्टर देख सकता हूं क्योंकि प्रत्येक ऑब्जेक्ट को नष्ट कर दिया जाता है, इसलिए मैं उम्मीद करता हूं कि प्रक्रिया मेमोरी डिस्प्ले को ड्रॉप होने के कारण ड्रॉप होता है - लेकिन यह नहीं है । मेरे आवेदन में कतार निर्माता / उपभोक्ता थ्रेड्स में उपयोग किया जाता है और मेमोरी उपयोग अभी भी बढ़ता रहता है।
स्मृति को पुनर्प्राप्त करने का एकमात्र तरीका है कि मैं जब भी खुल गया इसके सभी आइटम:
q.swap (std :: queue & lt; foo * & gt; ());
यदि मैं एक कतार के बजाय एक वेक्टर का उपयोग करता हूं, तो संग्रहित ऑब्जेक्ट्स को हटाते हुए प्रक्रिया मेमोरी उपयोग तुरंत गिर जाता है।
टिप्पणियों से स्पष्ट करने के लिए संपादित करें : मैं समझता हूं कि कतार पॉइंटर वेरिएबल्स की स्मृति को प्रबंधित करता है (यानी 4 या 8 बाइट प्रति पॉइंटर), और जब मैं उस मेमोरी को जारी किया जाता है तब मैं नियंत्रित नहीं कर सकता क्या मुझे इसके बारे में चिंतित है कि हेप मेमोरी की ओर इशारा किया जा रहा है, जो मैं नए और हटाने के माध्यम से प्रबंध कर रहा हूं, समय पर भी रिहा नहीं किया जा रहा है।
* 2 संपादित करें: ऐसा प्रतीत होता है जब प्रक्रिया को डीबग किया जा रहा है .. तो वास्तविकता में वास्तव में कोई समस्या नहीं है अभी भी अजीब है।
हटाए / फ्री के कई कार्यान्वयन हमेशा सभी मेमोरी को ऑपरेटिंग को फिर से नहीं बना सकता है तुरंत सिस्टम - स्मृति अभी थोड़ी देर के लिए उस प्रक्रिया के लिए उपलब्ध हो सकती है। इसलिए यदि आप अपने आरएसएस या कुछ चीजों को मापते हैं, तो आप जरूरी नहीं कर सकते कि यह तुरंत उस झटके से नीचे जाना चाहिए जो कुछ नष्ट हो जाता है। मुझे लगता है कि व्यवहार अलग-अलग डिबग मोड में हो सकता है, जो आप देख रहे हैं कि क्या समझा जाएगा।
Comments
Post a Comment