इसके कई कारण हो सकते हैं। उनमें से कुछ को सूचीबद्ध करने के लिए:
- स्मार्ट पॉइंटर्स हाल ही में मानक का हिस्सा बने। तब तक वे अन्य पुस्तकालयों का हिस्सा थे
- मेमोरी लीक से बचने के लिए उनका प्राथमिक उपयोग है; कई पुस्तकालयों का अपना मेमोरी मैनेजमेंट नहीं है; आम तौर पर वे उपयोगिताओं और एपीआई प्रदान करते हैं
- वे आवरण के रूप में कार्यान्वित किए जाते हैं, क्योंकि वे वास्तव में ऑब्जेक्ट हैं और न कि पॉइंटर्स। कच्चे संकेत की तुलना में अतिरिक्त समय / स्थान लागत होती है; हो सकता है कि पुस्तकालयों के उपयोगकर्ता इस तरह के ओवरहेड्स न चाहें
संपादित करें : स्मार्ट पॉइंटर्स का उपयोग करना पूरी तरह से डेवलपर की पसंद है। यह विभिन्न कारकों पर निर्भर करता है।
प्रदर्शन महत्वपूर्ण प्रणालियों में, आप स्मार्ट पॉइंटर्स का उपयोग नहीं करना चाह सकते हैं जो ओवरहेड उत्पन्न करता है
जिस परियोजना को पिछड़ी संगतता की आवश्यकता है, आप स्मार्ट पॉइंटर्स का उपयोग नहीं करना चाह सकते हैं जिसमें सी ++ 11 विशिष्ट विशेषताएं हैं
Edit2 नीचे दिए गए मार्ग के कारण 24 घंटों के अंतराल में कई डाउनवोट्स का एक तार है। मैं यह समझने में विफल रहा कि उत्तर को नीचे क्यों रखा गया है, हालांकि नीचे केवल एक ऐड-ऑन सुझाव है और उत्तर नहीं है।
हालाँकि, C ++ आपको हमेशा विकल्प खुला रखने की सुविधा देता है। :) जैसे
template<typename T>
struct Pointer {
#ifdef <Cpp11>
typedef std::unique_ptr<T> type;
#else
typedef T* type;
#endif
};
और अपने कोड में इसका उपयोग करें:
Pointer<int>::type p;
जो लोग कहते हैं कि एक स्मार्ट पॉइंटर और एक कच्चा पॉइंटर अलग हैं, मैं इससे सहमत हूं। ऊपर दिया गया कोड केवल एक विचार था जहां कोई ऐसा कोड लिख सकता है जो सिर्फ एक के साथ विनिमेय हो #define
, यह बाध्यता नहीं है ;
उदाहरण के लिए, T*
स्पष्ट रूप से हटाया जाना चाहिए , लेकिन एक स्मार्ट पॉइंटर नहीं करता है। हम Destroy()
संभाल करने के लिए एक अस्थायी हो सकते हैं।
template<typename T>
void Destroy (T* p)
{
delete p;
}
template<typename T>
void Destroy (std::unique_ptr<T> p)
{
// do nothing
}
और इसे इस प्रकार उपयोग करें:
Destroy(p);
उसी तरह, एक कच्चे पॉइंटर के लिए हम इसे सीधे कॉपी कर सकते हैं और स्मार्ट पॉइंटर के लिए हम विशेष ऑपरेशन का उपयोग कर सकते हैं।
Pointer<X>::type p = new X;
Pointer<X>::type p2(Assign(p));
इस प्रकार Assign()
है:
template<typename T>
T* Assign (T *p)
{
return p;
}
template<typename T>
... Assign (SmartPointer<T> &p)
{
// use move sematics or whateve appropriate
}