मैं एक struct
है कि इस तरह दिखता है:नि: शुल्क एक एसटीडी द्वारा प्रयुक्त स्मृति :: स्ट्रिंग
struct queue_item_t {
int id;
int size;
std::string content;
};
मैं एक std::vector<queue_item_t>
जो एक डेटाबेस क्वेरी से इनमें से कई के साथ आबादी है।
जब प्रत्येक आइटम संसाधित होता है, तो डिस्क से फ़ाइल को पढ़ा जाता है और इसकी सामग्री content
स्ट्रिंग सदस्य में डाल दी जाती है। आइटम संसाधित किया गया है (content
पार्स किया गया है) और मैं स्ट्रिंग पर .clear()
निष्पादित करता हूं ताकि मेरी सभी मेमोरी न खाएं।
हालांकि, यह स्मृति को मुक्त नहीं लगता है। मेरे पास सैकड़ों हजारों वस्तुओं को संसाधित किया जा रहा है और आखिरकार, स्मृति उपयोग उपलब्ध होने से परे बढ़ेगा और लिनक्स द्वारा "आउट ऑफ़ मेमोरी" के कारण एप्लिकेशन को मार दिया गया है।
मैं इन तारों द्वारा उपयोग की गई स्मृति को कैसे मुक्त कर सकता हूं?
क्या आपको संरचना के सदस्य के रूप में 'सामग्री' की आवश्यकता है? आपके स्पष्टीकरण से, ऐसा लगता है कि यह केवल संक्षेप में उपयोग किया जाता है, इसलिए कार्य के लिए एक अस्थायी बेहतर अनुकूल हो सकता है। इसके अतिरिक्त, 'std :: vector' की बजाय' std :: queue' का उपयोग क्यों न करें? –
तथ्य यह है कि आपकी संरचना को 'queue_item_t' कहा जाता है, यह बताता है कि उनमें से वेक्टर किसी प्रकार की कतार का प्रतिनिधित्व करता है। यदि ऐसा है, तो प्रक्रिया के बाद आप कतार से तत्वों को क्यों नहीं हटाते?मैं पूछता हूं क्योंकि यह हो सकता है कि आपकी समस्या का उचित समाधान कहीं और स्थित है। उन्हें नष्ट करना (और उनकी 'सामग्री' स्ट्रिंग) अपने संसाधनों को जारी करने का एक निश्चित तरीका है! तो आपको केवल इस तथ्य से निपटना होगा कि वेक्टर की शुरुआत से हटाना कुशल नहीं है - इसलिए इसके बजाय 'डेक्यू 'का उपयोग करें, या यदि उनके द्वारा संसाधित किए गए आदेश से कोई फर्क नहीं पड़ता है तो प्रक्रिया को विपरीत क्रम में कोई फर्क नहीं पड़ता। –
@SanderDeDycker जो हिस्सा मैं अब कर रहा हूं वह पूरी प्रक्रिया का दूसरा हिस्सा है; सामान्य ऑपरेशन के तहत, डेटा फ़ाइलों से कभी नहीं पढ़ा जाता है, लेकिन इंटरनेट से पुनर्प्राप्त किया जाता है और डेटा को डाउनलोड किए गए प्रत्येक आइटम की 'सामग्री' स्ट्रिंग में सीधे रखा जाता है। लेकिन आप सही हैं, कि विभिन्न परिस्थितियों में, एक अस्थायी चर बेहतर होगा। –