मैं अपने आवेदन के भीतर एसटीएल string
का उपयोग कर रहा हूं, और मैं हाल ही में मेमोरी लीक के लिए इसका परीक्षण कर रहा था, और मैंने देखा कि कार्यक्रम के अंत तक मेरे कई तारों को ठीक तरह से हटाया नहीं जा रहा था।सी/सी ++ स्ट्रिंग मेमोरी लीक?
मैं तार से एक के साथ निम्नलिखित कोड (शब्दशः नहीं) का परीक्षण किया:
const string* cppString = &obj->objString;
const char* cString = cppString->c_str();
delete obj;
उसके बाद, मैं एक ब्रेक सूत्री रख दिया और देखा, कि जब तक string
कि cppString
नहीं रह गया है अस्तित्व में की ओर इशारा किया, cString
अभी भी एक सी-स्टाइल स्ट्रिंग को इंगित कर रहा था, जो निश्चित रूप से पर्याप्त था, वह अंत में समाप्त होने में असफल रहा था।
क्या मुझे सी/सी ++ तारों के काम के मामले में कुछ याद आ रही है? मैं स्ट्रिंग के सी प्रतिनिधित्व को भी हटाया जा सकता हूं?
संपादित करें: कुछ और जानकारी। मेरा obj
वर्ग Dialog
का प्रकार है, जो Popup
विरासत में मिलता है। मैंने सोचा कि शायद यह हो सकता है, क्योंकि जब मैं obj
हटाता हूं, तो मैं इसे Popup*
के रूप में देख रहा हूं, लेकिन मैंने इसे एक छोटे से अलग कार्यक्रम में करने की कोशिश की, और अभिभावक वर्ग के रूप में हटाने से बच्चे के सदस्य चर को ठीक से हटा दिया जाता है (जो समझ में आता है , बेशक)।
मैं स्मृति रिसाव वी.एस. भीतर अनुरेखण इस्तेमाल किया है, और यह पता चलता है कि स्ट्रिंग है जो लीक समाप्त हो गया एक जब मैं Dialog
बना दिया है और स्ट्रिंग निर्माता के लिए एक संदर्भ के रूप में पारित करने के लिए objString
सेट बनाया गया था कि था।
धन्यवाद,
Jengerer
(ओह, मेरी पिछली टिप्पणी ऑपरेटर प्राथमिकता पढ़ने में गलती से पीड़ित थी)। मुझे लगता है कि आपको और कोड दिखाना होगा। 'ओबीजे' की परिभाषा को देखते हुए और इसका आवंटन कैसे किया जाता है, यह अनुमान लगाना मुश्किल है कि क्या 'obj-> objString' सही ढंग से मुक्त हो जाएगा। –
यह एक गड़बड़ की तरह दिखता है, इसलिए मैं अपनी टिप्पणी के साथ ओपी को अपडेट करने जा रहा हूं। – Jengerer
क्या 'पॉपअप' का आभासी विनाशक है? –