आप इस तरह की चीजों को मुफ्त मेमोरी, क्लोज फाइल्स, मैन्युअल रूप से रखना पसंद करते हैं? यदि ऐसा है, तो मैं न्यूनतम और आम तौर पर मेरे द्वारा उपयोग की जाने वाली अन्य भाषाओं की तुलना में कम कहता हूं, खासकर अगर हम सामान्य करते हैं कि न केवल "स्मृति प्रबंधन" बल्कि "संसाधन प्रबंधन।" उस अर्थ में, मुझे वास्तव में लगता है कि 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::vector
। file.Close()
ऊपर दिए गए इस तरह के कोड को अक्सर, विशेषकर एक finally
ब्लॉक के संदर्भ में , क्योंकि स्थानीय संसाधन को मैन्युअल रूप से मुक्त करने की आवश्यकता होती है, जब सी ++ के आसपास की संपूर्ण मानसिकता को स्वचालित करने की आवश्यकता होती है।
मैनुअल मेमोरी प्रबंधन के संदर्भ में, मैं कहूंगा कि C को अधिकतम, जावा / C # एक मध्यम राशि की आवश्यकता है, और C ++ इनमें से न्यूनतम है। C ++ का उपयोग करने में थोड़ा शर्म करने के कई कारण हैं क्योंकि यह मास्टर करने के लिए बहुत कठिन भाषा है, लेकिन स्मृति प्रबंधन उनमें से एक नहीं होना चाहिए। इसके विपरीत मुझे वास्तव में लगता है कि यह इस एक पहलू में सबसे आसान भाषाओं में से एक है।
बेशक C ++ आपको मैन्युअल रूप से मेमोरी आवंटित करना और operator delete/delete[]
मैन्युअल रूप से फ्री मेमोरी को इनवोक करना शुरू करने देता है। यह आपको सी फंक्शन्स का उपयोग करने देता है जैसे malloc
औरfree
। लेकिन यह एक तरह की प्राचीन-शैली की कोडिंग प्रथा है, जो मुझे लगता है कि लोगों को श्रेय देने से बहुत पहले अप्रचलित हो गई थी, क्योंकि स्ट्रॉस्ट्रुप आरएआई की वकालत कर रहे थे, इससे पहले कि वह इस शब्द को बहुत पहले से गढ़ा था। इसलिए मुझे यह भी नहीं लगता कि "आधुनिक सी ++" कहना उचित है, संसाधन प्रबंधन को स्वचालित करता है, क्योंकि इसका उद्देश्य सभी के साथ होना चाहिए था। आप व्यावहारिक रूप से अपवाद-सुरक्षा प्राप्त नहीं कर सकते। यह सिर्फ इतना है कि 90 के दशक के शुरुआती दिनों में बहुत से गुमराह डेवलपर्स ने सी ++ का उपयोग वस्तुओं के साथ करने की कोशिश की, अक्सर अपवाद-हैंडलिंग को पूरी तरह से अनदेखा करते थे, और इसे कभी भी उस तरह से उपयोग नहीं किया जाना चाहिए था। यदि आप C ++ का उपयोग करते हैं, तो यह व्यावहारिक रूप से हमेशा उपयोग करने का इरादा था, तो मेमोरी प्रबंधन पूरी तरह से स्वचालित है और आम तौर पर कुछ ऐसा नहीं है जिसे आपको मैन्युअल रूप से व्यवहार करना है (या इसके साथ व्यवहार करना चाहिए)।