2010-05-12 18 views
8

यदि किसी वर्ग को निम्नानुसार घोषित किया गया है:ढेर/ढेर पर कक्षा के सदस्यों का आवंटन?

class MyClass 
{ 
    char * MyMember; 
    MyClass() 
    { 
    MyMember = new char[250]; 
    } 
    ~MyClass() 
    { 
    delete[] MyMember; 
    } 
}; 

और इसे इस प्रकार किया जा सकता है:

class MyClass 
{ 
    char MyMember[250]; 
}; 

एक वर्ग को ढेर पर आवंटित किया जाता है, जैसे कि मैं MyClass * Mine = new MyClass(); करता हूं आवंटित स्मृति कक्षा के तत्काल के साथ दूसरे उदाहरण में 250 बाइट आवंटित करता है? और क्या सदस्य MyClass ऑब्जेक्ट के पूरे जीवनकाल के लिए मान्य होगा? पहले उदाहरण के लिए, क्या यह ढेर पर कक्षा के सदस्यों को आवंटित करना व्यावहारिक है?

+0

संभावित डुप्लिकेट https://stackoverflow.com/questions/10836591/class-members-and-explicit-stack-heap- आवंटन) –

उत्तर

7

हाँ, हाँ, और हाँ।

आपके पहले उदाहरण में इसमें एक बग है, हालांकि: ऐसा इसलिए है क्योंकि यह डेटा डेटा सदस्यों में से एक हैप-आवंटित डेटा के साथ एक सूचक है, तो इसे एक प्रति-निर्माता और असाइनमेंट ऑपरेटर भी घोषित करना चाहिए, उदाहरण के लिए की तरह ...

MyClass(const MyClass& rhs) 
{ 
    MyMember = new char[250]; 
    memcpy(MyMember, rhs.MyMember, 250); 
} 
[कक्षा के सदस्यों और स्पष्ट ढेर/ढेर आवंटन] (की
+0

टिप के लिए धन्यवाद, मैं इस तकनीक का अधिक बार उपयोग करने पर विचार करूंगा। – SimpleButPerfect

+2

हालांकि तकनीकी रूप से क्रिस सही है, यह करना अच्छा नहीं है। इसके बजाय एक std :: वेक्टर का उपयोग करें और आपके सभी मेमोरी प्रबंधन का ख्याल रखा जाता है। पूर्ण विवरण देखने के लिए: http://stackoverflow.com/questions/255612/c- गतिशील रूप से-allocating-an-array-of-objects/255744#255744 –

+1

प्रश्न एरे के बारे में बिल्कुल नहीं था, मुझे बदलना चाहिए था यह उदाहरण, यह आवंटन की अवधारणा के बारे में था। – SimpleButPerfect

1

जब आप new पर कॉल करते हैं तो यह ढेर से आवंटित होता है, अन्यथा यह ढेर से आवंटित होता है (हम malloc और इसके जैसे) को अनदेखा करेंगे।

आपके पहले उदाहरण में, MyClass (32-बिट पॉइंटर्स मानते हुए) के उदाहरण के लिए स्टैक पर 4 बाइट्स और MyMember को दिए गए बफर के लिए ढेर पर 250 बाइट्स आवंटित स्थान होंगे।

दूसरे उदाहरण में, MyClass के उदाहरण के लिए स्टैक पर आवंटित 250 बाइट होंगे। इस मामले में, माईमेम्बर को उदाहरण में ऑफसेट के रूप में माना जाता है।

+1

यह वास्तव में सही नहीं है, दूसरे उदाहरण में, कक्षा में 250 वर्णों की एक सरणी है।यदि आप 'MyClass * foo = new MyClass' जैसे कुछ करते हैं तो सभी ढेर पर होंगे; ' – Hasturkun

+0

आह - मुझे 'नया MyClass' नहीं देखा गया था (या शायद ओपी इसे" संपादन में नहीं जोड़ा गया " समय सीमा)। तो यह सवाल बिल्कुल सही नहीं है क्योंकि प्रश्न खड़ा है। लेकिन दुर्भाग्य से, मैं इसे हटा नहीं सकता। – Anon

3

प्रारंभिक नोट: एक ढेर आवंटित char [] के बजाय std::string का उपयोग करें।

क्या आवंटित स्मृति कक्षा के तत्कालता के साथ दूसरे उदाहरण में 250 बाइट आवंटित करता है?

इसे कन्स्ट्रक्टर में आवंटित किया जाएगा, वैसे ही एक स्टैक आवंटित MyClass में। यह निर्भर करता है कि "साथ" के साथ आपका क्या मतलब है, यह आवश्यक रूप से एक साथ आवंटित नहीं किया जाएगा।

और क्या सदस्य MyClass ऑब्जेक्ट के पूरे जीवनकाल के लिए मान्य होगा?

हां।

पहले उदाहरण के लिए, क्या यह वर्ग के सदस्यों को ढेर पर आवंटित करना व्यावहारिक है?

हां, कुछ मामलों में। कभी-कभी आप हेडर फ़ाइल से शामिल करना चाहते हैं, और कभी-कभी आप सदस्य बनाने के लिए फ़ैक्टरी फ़ंक्शन का उपयोग करेंगे। आम तौर पर हालांकि, मैं बस एक साधारण गैर-सूचक सदस्य के साथ जाता हूं।

+0

इस तरह के विस्तृत उत्तर के लिए धन्यवाद, शुरुआती नोट के लिए मैं इस विषय के बारे में ज्ञान इकट्ठा करने की कोशिश कर रहा हूं। – SimpleButPerfect

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