2014-05-10 14 views
5
int* alloc() 
{ 
    int* tmp = new int; 
    return tmp; 
} 

int main() 
{ 
    int* ptr = alloc(); 
    ...... 
    ...... 
    delete ptr; 
    return 0; 
} 
  1. यहाँ मैं tmp मुक्त नहीं है, लेकिन स्पष्ट रूप से ptr मुक्त हो जाता है। क्या पीपीआर और टीएमपी उसी स्थान को संदर्भित करने के बाद भी मुक्त हो जाएगा?क्या यह सी ++ में मेमोरी रिसाव का कारण बनता है?

  2. यदि नहीं तो पॉइंटर टीएमपी के साथ क्या होता है? क्या यह स्मृति रिसाव का कारण बनता है?

+1

यह रिसाव का कारण नहीं बनता है। पॉइंटर 'tmp' स्वयं एक स्टैक वैरिएबल है, इसलिए यह' alloc() 'रिटर्न के बाद किसी भी मेमोरी का उपयोग नहीं करता है। –

+0

जब यह नए ऑपरेटर का उपयोग करता है तो tmp एक स्टैक चर कैसे है? – kishore

+1

@ किशोर: 'पीआरटी 'सिर्फ एक पता रखता है। वह पता ढेर पर संग्रहीत है। यह _points to_ (संसाधन) कहीं और है, और यही वह है जिसे आपको मुक्त करने की आवश्यकता है (संसाधन, पॉइंटर नहीं)। 'prt हटाएं;' वास्तव में _anything_ को 'ptr'' में नहीं करता है। केवल यह क्या इंगित करता है। – Mat

उत्तर

5

नहीं, इससे स्मृति रिसाव नहीं होता है। मेमोरी लीक बफर (स्मृति के ब्लॉक) जिन्हें आवंटित किया गया है लेकिन वापस नहीं किया गया है (जब वे अब उपयोग नहीं किए जाएंगे)। आपके alloc() फ़ंक्शन में, tmp एक बफर नहीं है ... यह एक चर है कि new पर कॉल करने के बाद, पता एक बफर के पास है। आपका फ़ंक्शन यह पता देता है, main() में, ptr चर में संग्रहीत हो जाता है। जब आप बाद में delete ptr पर कॉल करते हैं, तो आप बफर को ptr अंक जारी कर रहे हैं, इस प्रकार बफर जारी किया गया है और कोई रिसाव नहीं है।

+0

क्या होता है जब मेरे पास एक ही स्मृति स्थान और उन पॉइंटर्स में से एक को इंगित करने वाले कई रॉ संकेतक होते हैं? क्या स्मृति तब मुक्त हो गई है? – kishore

+0

@ किशोर हां, आपको अपने बफर को बिल्कुल एक बार मुक्त करना होगा, और इससे कोई फर्क नहीं पड़ता कि कितने स्थान (पॉइंटर्स) आपको बफर के पते की एक प्रति मिली है। – mah

3

आपका कार्यक्रम एक स्मृति का कारण नहीं बनेगा रिसाव बशर्ते कोई ध्यान में न आया अपवाद फेंक दिया जाता है।

बेहतर होगा कि तुम क्या करना है और इसे इस तरह 100% बम प्रूफ बना सकते हैं:

#include <memory> 

std::unique_ptr<int> alloc() 
{ 
    std::unique_ptr<int> tmp { new int }; 
    //... anything else you might want to do that might throw exceptions 
    return tmp; 
} 

int main() 
{ 
    std::unique_ptr<int> ptr = alloc(); 

    // other stuff that may or may not throw exceptions 

    // even this will fail to cause a memory leak. 
    alloc(); 
    alloc(); 
    alloc(); 

    auto another = alloc(); 

    // note that delete is unnecessary because of the wonderful magic of RAII 
    return 0; 
} 

जल्दी इस आदत में शामिल हों।

संबंधित मुद्दे