C ++ में मेमोरी मैनेजमेंट करने में प्रोग्रामर का कितना समय व्यतीत होता है


39

जो लोग एकत्रित भाषाओं को कचरा करने के लिए उपयोग किए जाते हैं, वे अक्सर C ++ के मेमोरी प्रबंधन से डरते हैं। ऐसे उपकरण हैं, जैसे auto_ptrऔर shared_ptrजो आपके लिए कई स्मृति प्रबंधन कार्यों को संभालेंगे। C ++ पुस्तकालयों के बहुत सारे उपकरण उन उपकरणों से पहले होते हैं, और स्मृति प्रबंधन कार्यों को संभालने का अपना तरीका होता है।

स्मृति प्रबंधन कार्यों पर आप कितना समय बिताते हैं?

मुझे संदेह है कि यह आपके द्वारा उपयोग किए जाने वाले पुस्तकालयों के सेट पर अत्यधिक निर्भर है, इसलिए कृपया कहें कि आपका उत्तर किन लोगों पर लागू होता है, और यदि वे इसे बेहतर या बदतर बनाते हैं।


1
इतना नहीं, वास्तव में ... विशेष रूप से सी ++ 0x, संदर्भ और एसटीएल के साथ। आप कोड को बिना मेमोरी प्रबंधन के भी लिख सकते हैं।
कोडर

9
सामान्य तौर पर: यदि आप अनुभवी हैं तो उतना नहीं। एक बहुत अगर आप C ++ (-> आमतौर पर शिकार स्मृति / संसाधन लीक) के लिए नौसिखिया हैं।
एमएआर

1
मुझे लगता है असली सवाल, इन दिनों, बासी संदर्भों का पीछा करने के बारे में अधिक है। और यह आम तौर पर हर बार स्पष्ट रूप से स्पष्ट होता है, बस यह कष्टप्रद है कि यह पहले नहीं पकड़ा गया था: पी
मैथ्यू एम।

मुझे पता है कि यह पुराना है, लेकिन IMO स्मृति प्रबंधन एक अच्छा प्रोग्रामर होने का एक अभिन्न अंग है। एसटीएल कंटेनरों की तरह सार अच्छा है, लेकिन स्मृति की अज्ञानता स्वयं गणना के बहुत विचार के खिलाफ है। एक के रूप में अच्छी तरह से पूछ सकते हैं कि कैसे एक बीजीय हेरफेर, तर्क और प्रोग्रामर के शस्त्रागार से पाशन को खत्म कर सकता है।
imallett

के बारे में " स्मृति प्रबंधन डिबग करने के लिए कितना समय उपयोग किया जाता है?" प्रति से, स्मृति प्रबंधन संभव है और C ++ में इतना कठिन नहीं है। तथ्य यह है: इसे स्थापित करना एक सटीक शिल्प है, और यह बकवास करने के लिए बहुत प्रवण है। जब आप बकवास करते हैं, तो आप नोटिस भी नहीं कर सकते हैं, और अनियमित व्यवहार के साथ पुरानी त्रुटियों को वापस ट्रैक कर सकते हैं जो समय के साथ ढेर हो गए हैं, वास्तविक समय सिंक है जिससे आपको डरना चाहिए। यही कारण है कि आधुनिक गैर कचरा एकत्र की गई भाषाएं, (मैं जंग के बारे में सोच रहा हूं) संकलक के लिए विशिष्ट त्रुटियों की जांच करने के लिए बहुत अधिक जिम्मेदारी ले गया।
ZJR

जवाबों:


54

आधुनिक सी ++ आपको स्मृति प्रबंधन के बारे में चिंता नहीं करता है जब तक कि आपके पास नहीं है, जब तक कि आपको अपनी स्मृति को हाथ से व्यवस्थित करने की आवश्यकता नहीं है, ज्यादातर अनुकूलन उद्देश्य के लिए, या यदि संदर्भ आपको ऐसा करने के लिए मजबूर करता है (बड़ा-बाधा हार्डवेयर सोचें)। मैंने कच्ची मेमोरी में हेरफेर किए बिना पूरे खेल को लिखा है, केवल कंटेनरों का उपयोग करने के बारे में चिंता करना जो किसी भी भाषा में, काम के लिए सही उपकरण हैं।

तो यह परियोजना पर निर्भर करता है, लेकिन ज्यादातर समय यह स्मृति प्रबंधन नहीं होता है जिसे आपको संभालना होता है, लेकिन केवल वस्तु जीवन-समय। यह स्मार्ट पॉइंटर्स का उपयोग करके हल किया गया है , जो कि RAII से उत्पन्न मुहावरेदार C ++ टूल में से एक है ।

एक बार जब आप RAII को समझ लेते हैं , तो स्मृति प्रबंधन एक समस्या नहीं होगी।

फिर जब आपको कच्ची मेमोरी का उपयोग करना होगा, तो आप इसे बहुत विशिष्ट, स्थानीय और पहचान वाले कोड में करेंगे, जैसे कि पूल ऑब्जेक्ट कार्यान्वयन में, "हर जगह" नहीं।

इस तरह के कोड के बाहर, आपको मेमोरी में हेरफेर करने की आवश्यकता नहीं होगी, केवल वस्तुओं को जीवन भर।

"कठिन" भाग RAII को समझना है।


10
बिल्कुल सच। पिछले 5 वर्षों में, मैंने केवल विरासत कोड के साथ काम करते समय "हटाएं" लिखा है।
drxzcl

3
मैं एक अत्यधिक स्टैक-साइज़ विवश एम्बेडेड वातावरण में काम करता हूँ। RAII जितना अच्छा है, अगर स्टैक स्पेस प्रीमियम पर है तो यह अच्छी तरह से काम नहीं करता है। तो यह सूचक micromanagement पर वापस आ गया है।
17

1
@ मिनी मैं कोड में पुस्तकालयों स्मार्ट पॉइंटर्स का उपयोग करता हूं जो उनके एपीआई में हेरफेर करता है, फिर मैं अपने एप्लिकेशन के लिए विशिष्ट कोड में मानक या स्मार्ट पॉइंटर्स का उपयोग करता हूं (यदि मैं उस बारे में निर्णय लेने वाला हूं)। यदि आप कुछ मॉड्यूल में लाइब्रेरी कोड को अलग कर सकते हैं, जो आपके अनुप्रयोग में कैसे उपयोग किए जाते हैं, तो आप निर्भरता से एपीआई प्रदूषण से बचते हैं।
KCL

12
@ पेपरफ़ेर: RAII deleteमैन्युअल रूप से अधिक स्टैक स्पेस नहीं लेगा , जब तक कि आपके पास एक भी शती क्रियान्वयन न हो।
डेडएमजी ऑक्ट

2
@ पेपरप्लेयर: ढेर पर स्मार्ट पॉइंटर वही जगह लेता है; अंतर यह है कि कंपाइलर एक फ़ंक्शन से सभी निकास पर संसाधन डील्लोकेशन कोड सम्मिलित करता है। और जब से यह इतना व्यापक रूप से उपयोग किया जाता है, यह आम तौर पर अच्छी तरह से अनुकूलित होता है (जैसे कई तरीकों को एक साथ मोड़ना, जो आप नहीं कर सकते - आप कोड नहीं डाल सकते हैं return)
MSalters 10

32

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

कचरा संग्रहण का समर्थन करने वाली भाषाएँ आमतौर पर न केवल इन संसाधनों के अस्तित्व को अनदेखा करती हैं, बल्कि वे एक विध्वंसक प्रदान करके भी इनको ठीक से संभालना कठिन बना देती हैं।

तो, संक्षेप में, मैं सुझाव दूंगा कि C ++ डेवलपर का ज्यादा समय स्मृति प्रबंधन के बारे में चिंता करने में नहीं बीता है। जैसा कि क्लेम का उत्तर इंगित करता है, एक बार जब आप RAII पर एक हैंडल प्राप्त करते हैं, तो बाकी सिर्फ पलटा होता है।


3
मैं विशेष रूप से प्यार करता हूँ कि कैसे HttpWebRequest.GetResponse लीक संभालती है और जीसी भाषाओं में दुर्घटनाग्रस्त होने लगती है। जीसी शांत है, जब तक यह चूसना शुरू नहीं हो जाता है क्योंकि संसाधन अभी भी रिसाव करते हैं। msdn.microsoft.com/en-us/library/… "सावधानी" देखें।
कोडर

6
स्मृति को संसाधन के रूप में देखने के लिए +1। विरासत कोड या नहीं, हमें कितनी बार जोर से चिल्लाने की आवश्यकता है: मेमोरी प्रबंधन एक कौशल है और अभिशाप नहीं है ।
एक्वेरेड

4
@ कोडर मुझे यकीन नहीं है अगर मैं अनुसरण करता हूं .. जीसी बेकार है क्योंकि यह संसाधनों का दुरुपयोग करना संभव है ..? मुझे लगता है कि C # एक अच्छा काम करता है जो निर्दिष्‍ट संसाधन प्रदान करता है जो कि आईडीसोपायरी का उपयोग कर जारी करता है ...
मैक्स

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

5
@deadalnix उनके पास finalizeनिर्माण है। हालाँकि, आप नहीं जानते कि इसे कब बुलाया जाएगा। इससे पहले कि आप सॉकेट्स, या WebResponse वस्तुओं से बाहर निकलेंगे? आपको ऐसे लेख मिलेंगे जो आपको बताते हैं कि आपको finalizeअच्छे कारण के साथ भरोसा नहीं करना चाहिए ।
डिसस्टर

13

बहुत सुंदर कोई नहीं। COM जैसी पुरानी तकनीकें भी, आप मानक पॉइंटर्स के लिए कस्टम डिलीटर्स लिख सकते हैं जो उन्हें बहुत कम समय में बदल देगा। उदाहरण के लिए, std::unique_ptrएक कस्टम डिलेटर की पांच पंक्तियों के साथ COM संदर्भ को विशिष्ट रूप से रखने के लिए परिवर्तित किया जा सकता है। यहां तक ​​कि अगर आपको मैन्युअल रूप से अपने स्वयं के संसाधन हैंडलर लिखना है, तो एसआरपी और कॉपी-एंड-स्वैप जैसे ज्ञान का प्रचलन हमेशा के लिए उपयोग करने के लिए संसाधन प्रबंधन वर्ग लिखना अपेक्षाकृत आसान बनाता है।

वास्तविकता यह है कि आपके C ++ 11 संकलक के साथ सभी साझा, अद्वितीय और गैर-स्वामित्व वाले सभी जहाज हैं, और आपको पुराने कोड के साथ भी उन्हें काम करने के लिए छोटे एडेप्टर लिखने होंगे।


1
C ++ के साथ आपको कितना कौशल होना चाहिए) एक कस्टम डिलीट करने वाला लिखने के लिए b) पता है कि एक कस्टम डिलेटर वह है जो आपको चाहिए? मैं पूछता हूं क्योंकि एक नई GC'd भाषा को चुनना आसान है और पूरी बात जाने बिना क्लोज-टू-राइट प्राप्त करना आसान है - सी ++ में भी सही होना आसान है?
शॉन मैकमिलन

1
@ सीनियनमिलन: कस्टम हटाने वाले लिखने और तैनात करने के लिए तुच्छ हैं, मैंने जिस COM का उल्लेख किया है वह सभी COM प्रकारों के लिए पांच लाइनें हैं, और आधुनिक C ++ में बुनियादी प्रशिक्षण वाले किसी भी व्यक्ति को उनसे परिचित होना चाहिए। आप एक GCed भाषा नहीं उठा सकते, क्योंकि आश्चर्य- GC COM ऑब्जेक्ट्स एकत्र नहीं करेगा। या फ़ाइल हैंडल। या अन्य प्रणालियों से प्राप्त मेमोरी। या डेटाबेस कनेक्शन। RAII उन सभी चीजों को करेगा।
डेडएमजी ऑक्ट

2
"एक GC'd भाषा चुनें," से मेरा मतलब है कि मैंने जावा / सी # / रूबी / पर्ल / जावास्क्रिप्ट / पायथन के बीच में खरीदारी की है, और इन सभी में एक ही संसाधन प्रबंधन शैली है - मेमोरी ज्यादातर स्वचालित है, और बाकी सब , आपको प्रबंधन करना होगा। यह मुझे लगता है जैसे आप कह रहे हैं कि C ++ के प्रबंधन उपकरण आपको फ़ाइल हैंडल / db कनेक्शन / etc को मेमोरी की तरह से प्रबंधित करने देते हैं, और जब आप इसे सीख लेते हैं तो यह अपेक्षाकृत सीधा होता है। ब्रेन सर्जरी नहीं। क्या मैंने ठीक समझा?
शॉन मैकमिलन

3
@ सीनमेमिलन: हां, यह बिल्कुल सही है, और यह जटिल नहीं है।
डेडएमजी

11

जब मैं C ++ प्रोग्रामर था (एक लंबे समय पहले), मैंने बग्स को पुन: पेश करने के लिए कड़ी मेहनत को ठीक करने की कोशिश करते समय मेमोरी मैनेजमेंट बग के बारे में एक लंबा समय बिताया ।

मॉडेम C ++ के साथ, मेमोरी प्रबंधन एक समस्या से बहुत कम है, लेकिन क्या आप इसे सही करने के लिए किसी बड़ी टीम पर भरोसा कर सकते हैं। की लागत / समय क्या है:

  • प्रशिक्षण (कई प्रोग्रामर मुद्दों की अच्छी समझ के साथ उत्पन्न नहीं होते हैं)
  • स्मृति प्रबंधन समस्याओं को खोजने के लिए कोड समीक्षाएं
  • स्मृति प्रबंधन समस्याओं का डीबग करना
  • हमेशा ध्यान रखें कि ऐप के एक हिस्से में एक बग, ऐप के एक असंबंधित हिस्से में एक मेमोरी मैनेजमेंट इश्यू के कारण हो सकता है

इसलिए यह केवल " करने " का समय नहीं है , यह बड़ी परियोजनाओं पर एक मुद्दा है।


2
मुझे लगता है कि कुछ C ++ प्रोजेक्ट्स ने बुरी तरह से लिखे गए कोड के कारण कभी-कभी अपनी मेमोरी लीक को ठीक करने की निराशा की है। बुरा कोड होने जा रहा है, और जब ऐसा होता है तो यह बहुत से अन्य लोगों का समय भी ले सकता है।
जेरेमी

@ जेरेमी, मैंने पाया कि जब मैं सी ++ से सी # में स्थानांतरित हुआ था, तब भी बहुत बुरी तरह से लिखा कोड था (यदि अधिक नहीं), लेकिन कम से कम प्रोग्राम का हिस्सा ढूंढना बहुत आसान था, जिसमें एक बग था।
इयान

1
हाँ, यह बहुत सारी दुकानें जावा या .NET में चली गई हैं। कचरा संग्रह खराब कोड की अपरिहार्य क्षति को कम करता है।
जेरेमी

1
अजीब तरह से पर्याप्त, हम उन समस्याओं को नहीं है।
डेविड थॉर्नले

1
@DavidThornley, मुझे लगता है कि बहुत सारी समस्या C ++ में UI कोड लिखने से थी, इन दिनों सबसे अधिक C ++ कोड जो मैं देख रहा हूं वह UI नहीं है
Ian

2

मैं बूस्ट और टीआर 1 पुस्तकालयों का उपयोग करता हूं, और वे एक गैर-मुद्दे को सख्त (नए / हटाएं) स्मृति प्रबंधन बनाते हैं। दूसरी ओर, C ++ में मेमोरी का आवंटन सस्ता नहीं है, और किसी को यह ध्यान देना चाहिए कि ये फैंसी साझा किए गए पॉइंट्स कहाँ बनाए गए हैं। आप कार्यस्थानों का उपयोग करके या स्टैक-आधारित मेमोरी के साथ काम करते हुए समाप्त होते हैं। सामान्य तौर पर, मैं कहूंगा कि यह ज्यादातर एक डिज़ाइन समस्या है, कार्यान्वयन समस्या नहीं।


2

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

ज्यादातर समय मैं (एक ग्राहक के रूप में) खर्च करता हूं, जिसमें अन्य एपिस से प्रकार होते हैं, इसलिए वे आपके कार्यक्रमों के संदर्भ में अच्छी तरह से कार्य करते हैं। उदाहरण: यह मेरा ThirdPartyFont कंटेनर है, और ... यह इस तरह से इन सुविधाओं का समर्थन करता है, और लागू करता विनाश, और संदर्भ इस तरह से गिनती, और इस तरह से कॉपी करने, और । उन निर्माणों में से कई जगह होने की आवश्यकता है, और यह अक्सर उन्हें डालने के लिए तार्किक जगह है। चाहे आप उस समय को शामिल करना चाहते हैं या नहीं, यह आपकी परिभाषा पर निर्भर करता है (इन एपियों के साथ हस्तक्षेप करते समय कार्यान्वयन की आवश्यकता है, वैसे भी, सही?)।

उसके बाद, आपको स्मृति और स्वामित्व को ध्यान में रखना होगा। निचले स्तर की प्रणाली में, यह अच्छा और आवश्यक है, लेकिन यह लागू करने में कुछ समय और मचान ले सकता है कि आपको चीजों को कैसे घूमना चाहिए। मैं इसे दर्द के रूप में नहीं देखता क्योंकि यह निचले स्तर की प्रणाली की आवश्यकता है। स्वामित्व, नियंत्रण और जिम्मेदारी स्पष्ट है।

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

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

यदि आप कंटेनर (ऑटो / शेयर पॉइंटर) का उपयोग नहीं कर रहे हैं, तो आप सिर्फ दर्द के लिए प्रार्थना कर रहे हैं।

मैं अपने पुस्तकालयों को लागू किया है। मुझे उन चीजों को लागू करने में समय लगता है , लेकिन अधिकांश लोग पुन: उपयोग करते हैं (जो आमतौर पर एक अच्छा विचार है)।


1

आप इस तरह की चीजों को मुफ्त मेमोरी, क्लोज फाइल्स, मैन्युअल रूप से रखना पसंद करते हैं? यदि ऐसा है, तो मैं न्यूनतम और आम तौर पर मेरे द्वारा उपयोग की जाने वाली अन्य भाषाओं की तुलना में कम कहता हूं, खासकर अगर हम सामान्य करते हैं कि न केवल "स्मृति प्रबंधन" बल्कि "संसाधन प्रबंधन।" उस अर्थ में, मुझे वास्तव में लगता है कि C ++ को Java या C # की तुलना में कम मैन्युअल संसाधन प्रबंधन की आवश्यकता होती है।

यह मुख्य रूप से डिस्ट्रक्टर्स के कारण होता है जो संसाधन (मेमोरी या अन्यथा) को नष्ट करने को स्वचालित करता है। आमतौर पर C ++ में किसी संसाधन को मैन्युअल रूप से खाली करने / नष्ट करने का एकमात्र समय होता है, यदि मैं एक व्लो-स्तरीय डेटा संरचना (कुछ लोगों को जो करने की आवश्यकता नहीं है) का उपयोग कर रहा हूं या एक सी एपीआई का उपयोग कर रहा हूं जहां मैं बस थोड़ा समय बिताता हूं C संसाधन को लपेटकर जिसे मैन्युअल रूप से मुक्त / नष्ट / बंद किया जाना है और RAII-अनुरूप C ++ आवरण में बंद किया जाना चाहिए।

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

इस बीच, अगर मैं जावा या सी # से तुलना करता हूं, तो आप अक्सर लोगों को वहां मैन्युअल रूप से फाइलें बंद करने के लिए पाते हैं, मैन्युअल रूप से सॉकेट को डिस्कनेक्ट करते हैं, ऑब्जेक्ट के संदर्भ सेट करते हैं ताकि उन्हें कचरा एकत्र करने की अनुमति मिल सके, आदि पूरी तरह से बहुत अधिक मैनुअल मेमोरी है; यदि आप मुझसे पूछें तो उन भाषाओं में संसाधन प्रबंधन। C ++ में आपको अक्सर unlockएक म्यूटेक्स की आवश्यकता नहीं होती है , क्योंकि म्यूटेक्स लॉकर स्वचालित रूप से आपके लिए तब करेगा जब म्यूटेक्स दायरे से बाहर हो जाएगा। उदाहरण के लिए, आपको C ++ में इस तरह की चीजें कभी नहीं करनी चाहिए:

System.IO.StreamReader file = new System.IO.StreamReader(path);
try
{
    file.ReadBlock(buffer, index, buffer.Length);
}
catch (System.IO.IOException e)
{
    ...
}
finally
{
    if (file != null)
        file.Close();
}

C ++ में मैन्युअल रूप से फ़ाइलों को बंद करने जैसी चीजें करने की कोई आवश्यकता नहीं है। वे अंत में खुद को तुरंत बंद कर देते हैं कि वे दायरे से बाहर हो जाते हैं या नहीं, परिणामस्वरूप वे सामान्य या असाधारण निष्पादन पथ के दायरे से बाहर निकल जाते हैं। स्मृति से संबंधित संसाधनों के लिए इसी तरह की चीज std::vectorfile.Close()ऊपर दिए गए इस तरह के कोड को अक्सर, विशेषकर एक finallyब्लॉक के संदर्भ में , क्योंकि स्थानीय संसाधन को मैन्युअल रूप से मुक्त करने की आवश्यकता होती है, जब सी ++ के आसपास की संपूर्ण मानसिकता को स्वचालित करने की आवश्यकता होती है।

मैनुअल मेमोरी प्रबंधन के संदर्भ में, मैं कहूंगा कि C को अधिकतम, जावा / C # एक मध्यम राशि की आवश्यकता है, और C ++ इनमें से न्यूनतम है। C ++ का उपयोग करने में थोड़ा शर्म करने के कई कारण हैं क्योंकि यह मास्टर करने के लिए बहुत कठिन भाषा है, लेकिन स्मृति प्रबंधन उनमें से एक नहीं होना चाहिए। इसके विपरीत मुझे वास्तव में लगता है कि यह इस एक पहलू में सबसे आसान भाषाओं में से एक है।

बेशक C ++ आपको मैन्युअल रूप से मेमोरी आवंटित करना और operator delete/delete[]मैन्युअल रूप से फ्री मेमोरी को इनवोक करना शुरू करने देता है। यह आपको सी फंक्शन्स का उपयोग करने देता है जैसे mallocऔरfree। लेकिन यह एक तरह की प्राचीन-शैली की कोडिंग प्रथा है, जो मुझे लगता है कि लोगों को श्रेय देने से बहुत पहले अप्रचलित हो गई थी, क्योंकि स्ट्रॉस्ट्रुप आरएआई की वकालत कर रहे थे, इससे पहले कि वह इस शब्द को बहुत पहले से गढ़ा था। इसलिए मुझे यह भी नहीं लगता कि "आधुनिक सी ++" कहना उचित है, संसाधन प्रबंधन को स्वचालित करता है, क्योंकि इसका उद्देश्य सभी के साथ होना चाहिए था। आप व्यावहारिक रूप से अपवाद-सुरक्षा प्राप्त नहीं कर सकते। यह सिर्फ इतना है कि 90 के दशक के शुरुआती दिनों में बहुत से गुमराह डेवलपर्स ने सी ++ का उपयोग वस्तुओं के साथ करने की कोशिश की, अक्सर अपवाद-हैंडलिंग को पूरी तरह से अनदेखा करते थे, और इसे कभी भी उस तरह से उपयोग नहीं किया जाना चाहिए था। यदि आप C ++ का उपयोग करते हैं, तो यह व्यावहारिक रूप से हमेशा उपयोग करने का इरादा था, तो मेमोरी प्रबंधन पूरी तरह से स्वचालित है और आम तौर पर कुछ ऐसा नहीं है जिसे आपको मैन्युअल रूप से व्यवहार करना है (या इसके साथ व्यवहार करना चाहिए)।


1
आधुनिक जावा में "संसाधनों के साथ प्रयास" है जो अंत में ब्लॉक में उस सभी गंदे कोड को हटा देता है। अंततः अवरोध होना आवश्यक है। लगता है कि डिजाइनरों ने RAII अवधारणा की नकल की है।
कीवारोन

0

टीम में वरिष्ठ तकनीकी लीड पर निर्भर करता है। कुछ कंपनियों में (मेरा सहित), स्मार्ट पॉइंटर नामक कोई अवधारणा नहीं है। इसे फैंसी माना जाता है। तो, लोग बस सभी जगह डिलीट डाल देते हैं और हर 2 महीने में मेमोरी लीक को ठीक करने के लिए ड्राइव होता है। डिलीट स्टेटमेंट की नई लहर हर जगह आती है। तो, कंपनी और वहां काम करने वाले लोगों पर निर्भर करता है।


1
क्या आपके वातावरण में कुछ ऐसा है जो आपको उपयोग करने से रोकता है auto_ptrऔर दोस्तों को?
शॉन मैकमिलन

2
लगता है जैसे आपकी कंपनी C ++ कोड नहीं लिखती है, आप C. लिख रहे हैं
gbjbaanb
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.