मेरी राय में, C ++ के खतरे कुछ हद तक अतिरंजित हैं।
आवश्यक खतरा यह है: जबकि C # आपको unsafe
कीवर्ड का उपयोग करके "असुरक्षित" पॉइंटर ऑपरेशन करने की सुविधा देता है , C ++ (ज्यादातर सी का एक सुपरसेट होने के नाते) आपको पॉइंटर्स का उपयोग करने देगा जब भी आप ऐसा महसूस करते हैं। पॉइंटर्स (जो सी के साथ समान हैं) के साथ अंतर्निहित सामान्य खतरों के अलावा, जैसे कि मेमोरी-लीक, बफर ओवरफ्लो, झूलने वाले पॉइंटर्स, आदि, सी ++ आपके लिए चीजों को गंभीरता से पेंच करने के लिए नए तरीके पेश करता है।
यह "अतिरिक्त रस्सी", इसलिए बोलने के लिए, जोएल स्पोल्स्की के बारे में बात कर रहा था , मूल रूप से एक चीज़ के लिए नीचे आता है: लेखन कक्षाएं जो आंतरिक रूप से अपनी स्मृति का प्रबंधन करती हैं, जिसे " नियम 3 " के रूप में भी जाना जाता है (जिसे अब नियम कहा जा सकता है) 4 का नियम या C ++ 11 में 5 का नियम)। इसका मतलब है, यदि आप कभी भी एक वर्ग लिखना चाहते हैं जो आंतरिक रूप से अपने स्वयं के मेमोरी आवंटन का प्रबंधन करता है, तो आपको यह जानना होगा कि आप क्या कर रहे हैं या अन्यथा आपका कार्यक्रम दुर्घटनाग्रस्त हो जाएगा। आपको सावधानी से एक कंस्ट्रक्टर, कॉपी कंस्ट्रक्टर, डिस्ट्रक्टर, और असाइनमेंट ऑपरेटर बनाना होगा, जो आश्चर्यजनक रूप से गलत होने में आसान है, जिसके परिणामस्वरूप रनटाइम के दौरान अक्सर विचित्र दुर्घटनाएं होती हैं।
हालांकि , में वास्तविक हर दिन C ++ प्रोग्रामिंग, यह बहुत ही दुर्लभ वास्तव में तो यह कहना है कि सी ++ प्रोग्रामर हमेशा "सावधान" इन नुकसान से बचने के लिए होने की जरूरत को गुमराह कर रहा है, एक वर्ग है कि अपनी ही स्मृति का प्रबंधन करता है लिखने के लिए। आमतौर पर, आप बस कुछ और कर रहे होंगे जैसे:
class Foo
{
public:
Foo(const std::string& s)
: m_first_name(s)
{ }
private:
std::string m_first_name;
};
यह वर्ग जावा या C # में आपके द्वारा किए गए कार्यों के बहुत करीब दिखता है - इसके लिए किसी स्पष्ट मेमोरी प्रबंधन की आवश्यकता नहीं होती है (क्योंकि पुस्तकालय वर्ग std::string
सभी का ध्यान रखता है), और डिफ़ॉल्ट रूप से सभी पर "3 नियम" सामान की आवश्यकता नहीं है कॉपी कंस्ट्रक्टर और असाइनमेंट ऑपरेटर ठीक है।
यह केवल तभी होता है जब आप कुछ करने की कोशिश करते हैं:
class Foo
{
public:
Foo(const char* s)
{
std::size_t len = std::strlen(s);
m_name = new char[len + 1];
std::strcpy(m_name, s);
}
Foo(const Foo& f); // must implement proper copy constructor
Foo& operator = (const Foo& f); // must implement proper assignment operator
~Foo(); // must free resource in destructor
private:
char* m_name;
};
इस मामले में, नौसिखियों के लिए असाइनमेंट, डिस्ट्रॉक्टर और कॉपी कंस्ट्रक्टर को सही करना मुश्किल हो सकता है। लेकिन ज्यादातर मामलों में, ऐसा करने का कोई कारण नहीं है। C ++ लाइब्रेरी कक्षाओं जैसे std::string
और का उपयोग करके मैन्युअल मेमोरी मैनेजमेंट को 99% समय से बचना बहुत आसान बनाता है std::vector
।
एक अन्य संबंधित मुद्दा मैन्युअल रूप से मेमोरी को प्रबंधित करना है जो अपवाद को फेंकने की संभावना को ध्यान में नहीं रखता है। पसंद:
char* s = new char[100];
some_function_which_may_throw();
/* ... */
delete[] s;
यदि some_function_which_may_throw()
वास्तव में कोई अपवाद नहीं छोड़ता है, तो आप एक मेमोरी लीक के साथ छोड़ दिए जाते हैं क्योंकि इसके लिए आवंटित मेमोरी s
को कभी भी पुनः प्राप्त नहीं किया जाएगा। लेकिन फिर, व्यवहार में यह शायद ही किसी और कारण के लिए एक मुद्दा है कि "3 का नियम" वास्तव में अब कोई समस्या नहीं है। यह बहुत दुर्लभ है (और आमतौर पर अनावश्यक) वास्तव में कच्चे पॉइंटर्स के साथ अपनी स्मृति का प्रबंधन करने के लिए। उपरोक्त समस्या से बचने के लिए, आपको केवल एक std::string
या एक का उपयोग std::vector
करना होगा, और अपवाद को फेंक दिए जाने के बाद विध्वंसक स्वचालित रूप से स्टैक अनइंडिंग के दौरान प्राप्त होगा।
तो, यहाँ एक सामान्य विषय यह है कि कई C ++ सुविधाएँ जो C से विरासत में नहीं मिली थीं , जैसे कि स्वचालित आरंभीकरण / विनाश, कॉपी निर्माता, और अपवाद, प्रोग्रामर को C ++ में मैन्युअल मेमोरी प्रबंधन करते समय अतिरिक्त सावधानी बरतने के लिए मजबूर करते हैं। लेकिन फिर, यह केवल एक समस्या है यदि आप पहली बार मैनुअल मेमोरी प्रबंधन करने का इरादा रखते हैं, जो कि मानक कंटेनर और स्मार्ट पॉइंटर्स होने पर शायद ही कभी आवश्यक हो।
इसलिए, मेरी राय में, जबकि C ++ आपको बहुत अधिक अतिरिक्त रस्सी देता है, यह शायद ही कभी इसे अपने आप को लटकाए रखने के लिए उपयोग करने के लिए आवश्यक है, और जोएल के बारे में बात कर रहे थे आधुनिक सी ++ में बचने के लिए तुच्छ आसान है।
Your questions should be reasonably scoped. If you can imagine an entire book that answers your question, you’re asking too much.
। मेरा मानना है कि यह इस तरह के एक प्रश्न के रूप में उत्तीर्ण होता है ...