2009-02-24 11 views
5

मैं एक सी ++ प्रोग्राम में कुछ मेमोरी सेविंग हासिल करने की कोशिश कर रहा हूं और मैं जानना चाहता हूं कि क्या मैं चर के चरम के रूप में ब्लॉक का उपयोग कर सकता हूं (जैसे पर्ल में)। के मैं एक विशाल उद्देश्य यह है कि कुछ संगणना निष्पादन करता है और परिणाम देता है मान लीजिए, करता है यह करने के लिए समझ में आता है:क्या मैं सी ++ में चर के दायरे को प्रबंधित करने के लिए ब्लॉक का उपयोग कर सकता हूं?

InputType input; 
ResultType result; 

{ 
    // Block of code 
    MyHugeObject mho; 
    result = mho.superHeavyProcessing(); 
} 

/* 
    My other code ... 
*/ 

मैं उम्मीद कर सकता हूँ जब ब्लॉक बाहर निकलने वस्तु नष्ट हो?

उत्तर

25

हाँ, आप कर सकते हैं।

विनाशक को के रूप में जल्द ही कॉल किया जाएगा जैसे और इसे ढेर-आवंटित स्मृति को छोड़ना चाहिए।

+0

कड़ाई से बोलते हुए, विनाशक को कॉल करना ऑब्जेक्ट स्टोरेज के लिए उपयोग की जाने वाली स्मृति को मुक्त करने जैसा नहीं है। – Constantin

+0

मुझे लगता है कि प्रश्न में * विशाल * शब्द का मानना ​​सुरक्षित है कि ऑब्जेक्ट ने ढेर पर स्मृति के बड़े हिस्से को आवंटित किया है और इसे मुक्त करना चाहता है (उदाहरण के लिए एक वेक्टर)। –

+0

मुझे खेद है, लेकिन मुझे लगता है कि MyHugeObject को ढेर पर आवंटित किया गया है, और जब तक एक स्पष्ट मॉलोक नहीं किया जाता है तब तक ढेर पर नहीं। कृपया मुझे सुधारें अगर मैं गलत हूं। – 0fnt

18

हाँ बिल्कुल, और स्मृति को संरक्षित करने के अलावा, विनाशक को दायरे से बाहर निकलने के लिए बुलाया जाता है, जहां आप विनाशक को वास्तव में कुछ करने के लिए विनाशक कहते हैं (आरएआईआई देखें)। उदाहरण के लिए, एक स्कोप आधारित लॉक बनाने के लिए और आसानी से इसे एक अपवाद सुरक्षित तरीके से रिलीज़ करें, या किसी साझा या बहुमूल्य संसाधन (फ़ाइल फ़ाइल हैंडल/डेटाबेस कनेक्शन की तरह) तक पहुंचने के लिए निर्धारित करें।

-रिक

+0

+1, एक बहुत अच्छी अवधारणा। – mghie

3

बस याद रखें कि किसी भी स्मृति आप नए/malloc कि नाशक में शायद मुक्त हो जाता है का उपयोग कर ढेर पर आवंटित वापस ओएस के लिए जारी किया नहीं किया जाएगा। आपकी प्रक्रिया उस पर हो सकती है और ओएस प्रक्रिया समाप्त होने तक इसे वापस नहीं लाएगा।

+0

हालांकि इस मामले में स्मृति ढेर पर है, जो ओएस शायद आपके कार्यक्रम के लिए पहले से ही प्रतिबद्ध है। (हालांकि विंडोज पर इस आश्चर्यजनक रूप से नहीं हमेशा मामला है!) –

+0

यह सच है - मेरी धारणा है कि किसी भी वस्तु विशाल वस्तु स्मृति आवंटन किया जाना चाहिए गतिशील आंतरिक रूप से भले ही वह ढेर पर ही किया गया था। – Jackson

+0

यह वास्तव में सटीक नहीं है। यद्यपि स्मृति का बड़ा हिस्सा अभी भी एप्लिकेशन को सौंपा जाएगा, अगर यह अप्रयुक्त हो जाता है, तो इसे भौतिक स्मृति से बाहर किया जाएगा और किसी भी तरह से प्रदर्शन में बाधा नहीं डाली जाएगी। कुछ ऑपरेटिंग सिस्टम (विंडोज़) कुछ हद तक कमजोर पोज़ेड आउट मेमोरी को कमजोर रूप से प्रबंधित करते हैं, लेकिन इसे हमेशा मेमोरी मैप किए गए फ़ाइल का उपयोग करके और इसके साथ किए जाने पर इसे अनैप करके किया जा सकता है, क्योंकि यह प्रभाव उस पते स्थान के लिए एक अलग पृष्ठ-फ़ाइल बनाता है। – SingleNegationElimination

2

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

+0

ऑब्जेक्ट्स वास्तव में ढेर-आवंटित स्मृति को इंगित करते हैं, लेकिन मैं जितनी जल्दी हो सके इसे मुक्त करना चाहता हूं। – tunnuz

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

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