2014-09-12 24 views
10

यदि मैं किसी विधि से संदर्भ लौटाता हूं तो मुझे बेहद उत्सुकता हो सकती है जिससे स्मृति रिसाव हो सकता है। नीचे उदाहरण की स्थिति है।क्या विधियां संदर्भ या संदर्भ वापस कर सकते हैं मेमोरी लीक का कारण बन सकता है?

class example 
{ 
public: 
    vector<int> & get_vect() 
    { 
    return vect; 
    } 
    int & get_num() 
    { 
    return num; 
    } 
private: 
    vector<int> vect; 
    int num; 
}; 


void test_run(example & input) 
{ 
    int & test_val = input.get_num(); 
    vector<int> & test_vect = input.get_vect(); 
} 

int main() 
{ 
    example one; 
    test_run(one); 
    return 0; 
} 

मेरा प्रश्न जब test_val और test_vect ढेर जब test_run रास्ते से भी निकल जाते है। क्या test_vect या test_val हटा दिया गया है जिससे वस्तु को दूषित हो सकता है?

+13

गतिशील स्मृति आवंटन शामिल होने पर एक स्मृति रिसाव केवल तब ही हो सकता है। – Angew

उत्तर

16

सं। संदर्भ कुछ अन्य के लिए उपनाम (या नाम) हैं। आप इसके बारे में के बारे में सोच सकते हैं पॉइंटर सेमेन्टिक्स के बिना कुछ पॉइंटर (और उनके नुकसान, हालांकि संदर्भ स्वयं कुछ मोड़ हैं)।

जब फ़ंक्शन test_run बाहर निकलता है, तो संदर्भ और केवल वे चले गए हैं। जो उन्होंने संदर्भित किया है उन्हें यादृच्छिक रूप से छुआ नहीं गया है, इसे हटाया नहीं गया है।

इसके अलावा, क्योंकि आप केवल उन चर के साथ काम कर रहे हैं जिनमें स्वचालित संग्रहण अवधि है और निर्माण के दौरान गतिशील स्मृति शामिल नहीं है, आप बस मेमोरी लीक नहीं कर सकते हैं। आपको अन्य समस्याएं हो सकती हैं जैसे कि ऐसे चर को इंगित करने वाले पॉइंटर को हटाने का प्रयास करना (कोशिश कर रहा है कि केवल core dump on coliru) लेकिन लीक नहीं।

8

सं यह एक स्मृति रिसाव, यदि आप new के साथ स्मृति का आवंटन नहीं कर रहे हैं, ढेर पर जिसका अर्थ है क्यों कारण चाहिए? आपके सभी चर स्टैक पर आवंटित किए गए हैं। संदर्भ अन्य चर के लिए उपनाम हैं।

सी ++ संदर्भ परिभाषा wikipedia के अनुसार:

सी में एक संदर्भ ++ की परिभाषा ऐसी है कि वह मौजूद करने की जरूरत नहीं है। इसे किसी मौजूदा ऑब्जेक्ट के लिए एक नए नाम के रूप में कार्यान्वित किया जा सकता है।

पॉइंटर्स और संदर्भों के बीच अंतर के बारे में बात करते हुए paragraph भी है।

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