2009-09-22 10 views
7
class A 
{ 
public: 
    A(); 
    ~A(); 
    int X; 
}; 

A::A() 
{ 
    X = 5; 
    int Y = 4; 
} 

//..... in another file 
A * objectOnHeap = new A(); 

इस मामले में, चूंकि "objectOnHeap" ढेर पर है, एक्स भी ढेर पर है, भले ही यह विशेष रूप से नया नहीं था? और इस मामले में वाई को ढेर पर आवंटित किया जाता है (और निश्चित रूप से दायरे से बाहर चला जाता है), सही?क्या ऑब्जेक्ट के सदस्य चर हैं जो ढेर पर स्वचालित रूप से ढेर पर हैं?

मुझे आश्चर्य है कि अगर स्मृति में वस्तुओं को कैसे संग्रहीत किया जाता है, तो यह समझने की कोशिश करते समय मुझे अपने तारों को पार कर गया है।

+1

'objectOnHeap' ढेर पर * नहीं * है। यह ढेर या डेटा खंड में है। इसका मूल्य एक सूचक है, जो ढेर पर कुछ * बिंदु * है। –

+0

@ रोब केनेडी, क्या आप डेटा सेगमेंट के बारे में विस्तार कर सकते हैं? मुझे आपकी बात दिखाई देती है हालांकि पॉइंटर स्वयं ढेर पर है, फिर भी यह डेटा ढेर पर संग्रहीत होता है। – BuckFilledPlatypus

उत्तर

17

हां। यह ढेर पर है। असल में, ढेर पर किसी ऑब्जेक्ट को आवंटित स्थान अपने सभी सदस्य चर को पकड़ने के लिए काफी बड़ा है।

5

हां, यह ढेर पर है।

कुछ विवरण: आप "नया" ऑपरेटर का उपयोग करते हैं, तो क्या होता है कि संकलक वर्ग के लिए ढेर पर पर्याप्त जगह आबंटित करता है, सभी सभी सदस्य चर के लिए आवश्यक है (यह भी हो सकता है जो अंतरिक्ष सहित है कक्षाएं, इस मामले में उनके आकार की गणना भी की जानी चाहिए, आदि)।

इसके बाद, निर्माता को डेटा सदस्य वर्गों पर, फिर वर्ग पर ही कहा जाता है।

जब भी आप विशेष रूप से ढेर पर स्मृति आवंटित नहीं करते हैं (आमतौर पर नए ऑपरेटर का उपयोग करके, या उस फ़ंक्शन को कॉल करना जो आपके लिए करता है), स्मृति को आपके उदाहरण में परिवर्तनीय वाई की तरह ढेर पर आवंटित किया जाता है।

3

मुझे लगता है कि आपके प्रश्न का आधा अनुत्तरित रहा: आप पूछ रहे थे कि क्या वाई अभी भी ढेर पर आवंटित है, यह वास्तव में सही है।

0

वाई स्थानीय रूप से बनाए जाने के बाद से ढेर पर है; एक्स ढेर पर है।

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