2011-02-12 13 views
29

से std :: स्ट्रिंग को ठीक से कैसे मुक्त करें, जब मैं इसका उपयोग कर रहा हूं तो ढेर पर आवंटित स्मृति से std :: स्ट्रिंग को हटाने का सबसे अच्छा तरीका क्या है? धन्यवाद!मेमोरी

+0

किसी अन्य वस्तु के समान ही। वास्तव में, क्या आप अपने प्रश्न को स्पष्ट कर सकते हैं? आप क्या कर रहे हैं, आप क्या हासिल करने की कोशिश कर रहे हैं, आपने क्या प्रयास किया और यह कैसे काम नहीं किया? –

+0

क्या आप अपना प्रश्न बढ़ा सकते हैं? किस संदर्भ पर? – vz0

+0

डाउनवोट क्यों? एक पूरी तरह से उचित सवाल की तरह लगता है कि सी ++ के लिए नया कोई पूछेगा। आईएमओ को दुनिया को और प्रोग्रामर की जरूरत है जो खुद को साफ करने के बारे में जानना चाहते हैं =) –

उत्तर

52

std::string सिर्फ एक सामान्य वर्ग है, इसलिए सामान्य नियम लागू होते हैं।

यदि आप स्टेक पर std::string ऑब्जेक्ट्स आवंटित करते हैं, जैसे ग्लोबल्स, वर्ग के सदस्यों के रूप में, ... आपको कुछ विशेष करने की आवश्यकता नहीं है, जब वे अपने विनाशक के दायरे से बाहर निकलते हैं, और यह मुक्त होने का ख्याल रखता है स्वचालित रूप से स्ट्रिंग के लिए उपयोग की गई स्मृति।

int MyUselessFunction() 
{ 
    std::string mystring="Just a string."; 
    // ... 
    return 42; 
    // no need to do anything, mystring goes out of scope and everything is cleaned up automatically 
} 

केवल मामला है कि आप कुछ है करने के लिए जब आप ढेर new ऑपरेटर का उपयोग करने पर एक std::string आवंटित है जहां; उस स्थिति में, new के साथ आवंटित किसी ऑब्जेक्ट के साथ, आपको इसे मुक्त करने के लिए delete पर कॉल करना होगा।

int MyUselessFunction() 
{ 
    // for some reason you feel the need to allocate that string on the heap 
    std::string * mystring= new std::string("Just a string."); 
    // ... 
    // deallocate it - notice that in the real world you'd use a smart pointer 
    delete mystring; 
    return 42; 
} 

उदाहरण में निहित के रूप में, सामान्य रूप में यह ढेर पर एक std::string आवंटित करने के लिए व्यर्थ है, और, जब आप (जरूरत है कि, अभी भी आप एक स्मार्ट सूचक भी स्मृति लीक के जोखिम से बचने के लिए इस तरह के सूचक संपुटित चाहिए में अपवादों का मामला, एकाधिक वापसी पथ, ...)।


  1. असल std::string परिभाषित किया गया है के रूप में

    namespace std 
    { 
        typedef std::basic_string<char> string; 
    }; 
    

    तो यह प्रकार char के पात्रों के लिए basic_string टेम्पलेट वर्ग के इन्स्टेन्शियशन के लिए एक पर्याय है (इस जवाब में कुछ भी नहीं बदलता है, लेकिन SO पर आप नौसिखिया प्रश्नों पर भी पैडेंटिक होना चाहिए)।

+0

और यहां मैं सोच रहा था कि std :: स्ट्रिंग एक सामान्य वर्ग होने के बजाय टेम्पलेट क्लास std :: basic_string के लिए एक char element प्रकार के साथ टाइप किया गया था। ऐसा नहीं है कि एक टेम्पलेट वर्ग (या एक संरचना होने या एक आदिम प्रकार होने के लिए) टाइप करने के लिए ऑटो और गतिशील वस्तुओं के विनाश और deallocation में कोई फर्क पड़ता है। –

+0

@Pete: सही, जोड़ा स्पष्टीकरण। –

+0

@ माटेटेओ, यह अभी भी गलत है। यह एक विशेषज्ञता नहीं है, यह एक तात्कालिकता है। और नौसिखिया प्रश्नों पर पैडेंटिक होना विशेष रूप से महत्वपूर्ण है क्योंकि अन्यथा नए लोग आसानी से गलत शर्तों को उठाएंगे। मैं इस बारे में कम परवाह नहीं कर सकता कि यह एक विशेषज्ञता या तात्कालिकता है, लेकिन एक नौसिखिया "विशेषज्ञता == टाइपिफ़" सोच सकता है जो उचित दिखता है, लेकिन सादा गलत है। –

4

यदि यह ढेर पर है तो delete का उपयोग करें, और यदि यह ढेर पर है तो कुछ भी नहीं।

5
std::string foo("since it's on the stack, it will auto delete out of scope"); 

या:

std::string* foo = new std::string("allocated on the heap needs explicit destruction") 
delete foo; 
1
void foo() { 
    string* myString = new string("heap-allocated objects are deleted on 'delete myString;'"); 
    cout << *myString << endl; 
    delete myString; 
} 

या बेहतर अभी तक, संकेत जब संभव से बचने और स्वत: चर का उपयोग:

void foo() { 
    string myString("stack-allocated string is automatically deleted when myString goes out of scope"); 
    cout << myString << endl; 
} 
0

बस किसी भी रूप में std :: स्ट्रिंग का इलाज मूल प्रकार

std::string *str = new std::string("whatever"); 
///code 
delete str;