2013-02-24 80 views
7

जावा पृष्ठभूमि से आ रहा है, मैं अभी भी सी ++ में स्मृति आवंटित करने के बारे में थोड़ा उलझन में हूं। मुझे पूरा यकीन है कि पहले दो कथन सही हैं:सी ++ ढेर और ढेर पर स्मृति आवंटित?

void method() { 
    Foo foo; // allocates foo on the stack, and the memory is freed 
       // when the method exits 
} 

void method2() { 
    Foo *foo = new Foo(); // allocates foo on the heap 
    delete foo;    // frees the memory used by foo 
} 

लेकिन इस तरह कुछ के बारे में क्या?

void method3() { 
    Foo foo = *new Foo(); // allocates foo on the heap, and then copies it to the stack? 
          // when the method exits, the stack memory is freed, but the heap memory isn't? 
} 

मैं method3() अंदर एक वैश्विक सरणी foo जोड़ा कहो। यदि विधि समाप्त होने के बाद मैंने foo के डेटा सदस्यों में से किसी एक तक पहुंचने का प्रयास किया, तो क्या यह काम करेगा? और method3() स्मृति रिसाव के लिए प्रवण है?

अग्रिम धन्यवाद।

+1

'फू फू(); वास्तव में कुछ भी आवंटित नहीं करता है। यह एक समारोह घोषित करता है। – chris

उत्तर

8
Foo foo(); 

नाम foo जो एक Foo ऑब्जेक्ट और किसी भी तर्क नहीं ले करता है के द्वारा एक समारोह की घोषणा:। इसे सी ++ में सबसे ज्यादा परेशान पार्स के रूप में जाना जाता है। आप शायद का मतलब:

Foo foo; 

यह एक foo वस्तु स्थानीय स्तर पर/स्वत: भंडारण पैदा करता है। ऑब्जेक्ट स्वचालित रूप से दायरे { } के बाद हटा दिया जाता है जिसमें इसे समाप्त घोषित किया जाता है।


Foo *foo = new Foo(); // allocates foo on the heap 
delete foo; 

यह सच है, freestore पर वस्तु foo द्वारा बताया पुनः आवंटित की जाती है एक बार आप delete कहते हैं। कोई स्मृति रिसाव नहीं है।


Foo foo = *new Foo(); 

freestore पर एक Foo वस्तु का आवंटन और उसके बाद उस वस्तु की एक प्रति foo प्रारंभ करने में प्रयोग किया जाता है। चूंकि आपके पास फ्रीस्टोर आवंटित ऑब्जेक्ट में पॉइंटर नहीं है, इसलिए यह स्मृति रिसाव का कारण बनता है। ध्यान दें कि यदि Foo के विनाशक के पास कुछ कोड है जो साइड इफेक्ट्स का कारण बनता है तो यह केवल स्मृति रिसाव नहीं है बल्कि अपरिभाषित व्यवहार है।

+0

मेरा मतलब था 'Foo foo() 'वर्ग' Foo' के लिए कोई तर्क निर्माता नहीं है। लेकिन आप सही हैं, भ्रम से बचने के लिए मैं इसे प्रश्न में बदल दूंगा। – nebulabrot

+1

@nebulabrot: 'Foo foo;' वह नहीं है, 'foo foo(); ' –

+0

फू विनाशक में दुष्प्रभाव मौजूद होने पर अपरिभाषित व्यवहार क्यों? मैं जटिल 'फू' के साथ कुछ उदाहरणों के बारे में सोच सकता हूं जहां यह मेमोरी लीक के बिना भी ठीक काम करेगा! – CygnusX1