2010-04-22 15 views
5

मैं टुकड़ास्टैक आवंटन विफल रहता है और ढेर आवंटन सफल होता है !! क्या यह संभव है?

Class Sample 
{ Obj_Class1 o1; 
    Obj_Class2 o2;}; 

का निम्न भाग लेकिन Obj_Class1 के आकार है और Obj_Class2 बहुत बड़ा है ताकि संकलक एक चेतावनी से पता चलता "ढेर करने के लिए कुछ जगह स्थानांतरित करने पर विचार"। मुझे Obj_Class1* o1 = new Obj_Class1(); के साथ Obj_Class1 o1 को प्रतिस्थापित करने के लिए कहा गया था, लेकिन मुझे लगता है कि इस परिवर्तन को करने का कोई उपयोग नहीं है क्योंकि ढेर आवंटन विफल होने पर ढेर आवंटन भी विफल हो जाएगा। क्या मैं सही हूँ? या यह परिवर्तन करने के लिए समझ में आता है (संकलक चेतावनी दबाने के अलावा)।

+0

जिज्ञासा से बाहर, कक्षाओं का आकार क्या है? – Naveen

+0

लगभग 65000bytes ... – Prabhu

+0

इसके अलावा पॉइंटर के साथ Obj_Class1 इंस्टेंस को बदलने की बजाय, क्या आप इसके बजाय ढेर पर अपनी आवश्यकताओं को आवंटित करने के लिए इसके कार्यान्वयन को बदलने में सक्षम हैं? यहां तक ​​कि इसे एक Pimpl में बदलना भी मदद कर सकता है। –

उत्तर

5

यह बहुत आम है कि ढेर ढेर से छोटा है। वे विभिन्न मेमोरी स्थानों का उपयोग करते हैं। ढेर आमतौर पर आकार में एक मेगाबाइट के बारे में होता है (आप इसे बदल सकते हैं, लेकिन सावधान रहें) और प्रति थ्रेड आवंटित किया जाता है। यदि आवश्यक हो तो ढेर गीगाबाइट का उपभोग कर सकते हैं।

+0

लेकिन ढेर और ढेर एक-दूसरे के खिलाफ बढ़ते हैं। क्या वे नहीं? – Prabhu

+0

@ प्रभु: हां, लेकिन अधिकतम स्टैक आकार अभी भी 1 मेगाबाइट की तरह smth तक सीमित है। – sharptooth

+0

@ प्रभु: नहीं, वे नहीं करते हैं। यह एक कंप्यूटर विज्ञान वर्ग के लिए स्पष्टीकरण का एक अच्छा मॉडल है, लेकिन हकीकत में उस मॉडल को वास्तव में इस्तेमाल करने के लिए मजबूर करने के लिए कुछ भी नहीं है। –

3

ढेर आमतौर पर छोटे होते हैं और बड़ी वस्तुओं को पकड़ने के लिए उपयुक्त नहीं होते हैं, जबकि ढेर अलग होता है और उनके लिए डिज़ाइन किया जाता है।

अपने नमूने में, आप शायद ढेर पर पूरे Sample आवंटित करना चाहिए, न कि उसके सदस्य:

int main() { 
    Sample* sample = new Sample(); 
} 
2

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

+0

नाइटपिक: स्टैक ओवरफ़्लो तब नहीं होता जब स्टैक आकार से अधिक आवंटित किया जाता है, बल्कि उपलब्ध स्टैक आकार को आवंटित करते समय। मेरा मतलब यह है कि यह कितना ढेर पहले से उपयोग किया जाता है इस पर निर्भर करता है या विफल नहीं होगा। – sharptooth

3

ढेर डिफ़ॉल्ट रूप से नहीं बल्कि छोटा है: http://msdn.microsoft.com/en-us/library/ms686774(VS.85).aspx

सुरक्षित और शुरू में प्रतिबद्ध ढेर स्मृति के लिए डिफ़ॉल्ट आकार निष्पादन योग्य फ़ाइल शीर्षक में निर्दिष्ट किया जाता है। थ्रेड या फाइबर निर्माण विफल रहता है अगर अनुरोधित बाइट्स की संख्या आरक्षित या प्रतिबद्ध करने के लिए पर्याप्त स्मृति नहीं है। लिंकर द्वारा उपयोग किया जाने वाला डिफ़ॉल्ट स्टैक आरक्षण आकार 1 एमबी है। सभी थ्रेड और फाइबर के लिए एक अलग डिफ़ॉल्ट स्टैक आरक्षण आकार निर्दिष्ट करने के लिए, मॉड्यूल परिभाषा (.def) फ़ाइल में STACKSIZE कथन का उपयोग करें। ऑपरेटिंग सिस्टम सिस्टम के आवंटन ग्रैन्युलरिटी (आमतौर पर 64 केबी) के निकटतम एकाधिक में निर्दिष्ट आकार को राउंड करता है। वर्तमान प्रणाली के आवंटन ग्रैन्युलरिटी को पुनः प्राप्त करने के लिए, GetSystemInfo फ़ंक्शन का उपयोग करें।

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