2010-11-23 16 views
5

एक कक्षा में मेरी कोड मैं कुछ "बदसूरत" संरचना का उपयोग मैं देखते हैं, की समीक्षा करने में है (जिसे "नक्शा") मैं एक वेक्टर जो एक "डाटा" वर्ग शामिल है:स्मृति प्रबंधन और std :: संभाजक

std::vector<PointerToHUGEClass> vector; 

जहां पॉइंटरटूहुगेक्लास नाम का वर्णन करता है। (हालांकि ऑब्जेक्ट की ओर इशारा करते हुए भी नक्शा वर्ग के स्वामित्व में है, और कन्स्ट्रक्टर में "नया" पैरामीटर के साथ बनाया गया है)। यह सब अच्छा काम करता है (फिलहाल)। हालांकि मुझे अभी भी लगता है कि यह एक काम के आसपास है।

केवल कारण मैं एक "PointerToHUGEClass" के बजाय सिर्फ "HUGEClass" का उपयोग कर रहा है, क्योंकि मुझे यकीन है कि वस्तु ढेर से घोषित नहीं किया गया है बनाना चाहते थे है। इससे पहले कि मैं आवंटकों को समझने से पहले यह बनाया गया था। अब मुझे लगता है कि यह आवंटन का कार्य कम या कम है ताकि यह सुनिश्चित किया जा सके कि स्मृति को ढेर से घोषित नहीं किया गया है।

मेरे सवालों का:

  • एम आई संभाजक संभालने में सही कर मदों से स्मृति प्रबंधन के लिए जिम्मेदार है? (और यह सुनिश्चित करना कि इसे स्टैक/फ्रीस्टोर/हीप/जो कुछ भी घोषित किया गया है)
  • std :: आवंटक क्या करता है? - क्या यह ढेर से, या ढेर से घोषित करता है?
  • (पिछले प्रश्न से फ़ॉलो करें): यदि मैं ढेर में घोषित एक आइटम को डेटास्ट्रक्चर में घोषित करता हूं तो क्या यह अभी भी ढेर में घोषित किया गया है?

धन्यवाद फिर से, paul23

+0

@ सिमोन: हम्म कि कोड को 'std :: vector 'या' std :: vector ' पढ़ने के लिए धन्यवाद पढ़ना चाहिए। (हालांकि यह वास्तव में मेरे प्रश्नों को नहीं बदलता है, प्रश्न सामान्य रूप से अधिक हैं क्योंकि यह कुछ ऐसा है जो मैं पहले से ही एक साल के लिए सोच रहा हूं) – paul23

उत्तर

8
  • हूँ मैं संभाजक संभालने में सही कर मदों से स्मृति प्रबंधन के लिए जिम्मेदार है?

नहीं, तुम नहीं कर रहे हैं (और यकीन है कि यह ढेर/freestore/ढेर/जो कुछ भी से घोषित किया जाता है बना रही है)। आवंटक new और delete पर केवल चीनी कोटिंग है और का निर्णय लेने के सामान्य जिम्मेदार में स्मृति आवंटित की जाएगी।allocate, deallocate, construct और destruct पर कॉल करने की ज़िम्मेदारी इसके उपयोगकर्ताओं के लिए है (जिसका मतलब है, std::vector)। आपके दृष्टिकोण से, यह स्वचालित हो जाएगा, जो कि यहां सब कुछ मायने रखता है।

  • std :: संभाजक क्या करता है? - क्या यह ढेर से, या ढेर से घोषित करता है?

std::allocator::operator new(size_t) का उपयोग कर आवंटित करने के लिए अनिवार्य है, इस प्रकार यह वैश्विक new ऑपरेटर की परिभाषा पर निर्भर करता है। आम तौर पर, इसका मतलब है ढेर। ढेर स्वचालित भंडारण अवधि के साथ वस्तु के लिए है।

  • (पिछले प्रश्न से अनुवर्ती): अगर मैं एक आइटम आंकड़ा संरचना करने के लिए ढेर में घोषित कॉपी यह अभी भी ढेर में घोषित किया जाता है?

आप किसी आइटम को कॉपी करते हैं, तो एक प्रति आवंटित किया जाता है जहां आप इसे कॉपी। यहां इसका मतलब है कि किसी आइटम को ढेर से ढेर तक कॉपी करना। फिर आपके पास ऑब्जेक्ट की दो प्रतियां हैं, जिसका अर्थ है कि एक प्रतिलिपि में परिवर्तन दूसरे पर दिखाई नहीं देते हैं।

हालांकि सावधान रहें, कि हम डिफ़ॉल्ट नकल मोड के बारे में बात कर रहे हैं, कि एक उथले प्रति है। यदि आप किसी ऑब्जेक्ट की प्रतिलिपि बनाते हैं, तो यह सब ठीक हो जाएगा; यदि आप एक सूचक की प्रतिलिपि बनाते हैं, तो केवल पॉइंटर की प्रतिलिपि बनाई जाएगी, डेटा की ओर इशारा नहीं किया जाएगा।

+0

क्या आप मुझे बता सकते हैं कि std :: आवंटक :: ऑपरेटर नया उपयोग करने के लिए अनिवार्य है? मुझे मानक में संदर्भ नहीं मिल रहा है। – Simone

+0

@ सिमोन: मैंने स्टीव जेसॉप द्वारा इस जवाब पर खुद को आधारित किया है http://stackoverflow.com/questions/4159641/does-stl-vector-use- new-and-delete-for-memory-allocation-by-default/4159686 # 4159686 जिसने सी ++ 0x के अंतिम मसौदे को संदर्भित नहीं किया है, जहां तक ​​मैं देख सकता हूं (20.4 के लिए वहां टुपल्स के बारे में है)। मैं इसे इस मसौदे में नहीं मिला। मैंने ऑपरेटर के हस्ताक्षर को अधिक सटीक बनाने के लिए संपादित किया है। –

0

आपके उत्तर:

  • हाँ, आप सही हैं। वैसे भी, यदि कंटेनर का टेम्पलेट प्रकार एक पॉइंटर है, जैसा कि आपके मामले में है, तो कंटेनर पॉइंटर के लिए मेमोरी आवंटित/डिलीकेट करेगा, न कि ऑब्जेक्ट जो पॉइंटर इंगित कर रहा है!

  • यह कार्यान्वयन पर निर्भर है, मानक के $ 20.2.5 में आवंटकों की आवश्यकताओं का वर्णन किया गया है।

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

HTH

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