unique_ptr यह प्रतिलिपि करने योग्य नहीं है, यह केवल जंगम है।
यह सीधे तौर पर टेस्ट को प्रभावित करेगा, जो कि, आपके दूसरे में, उदाहरण भी केवल चल और प्रतिलिपि योग्य नहीं है।
वास्तव में, यह अच्छा है कि आप उपयोग करें unique_ptrजो आपको एक बड़ी गलती से बचाता है।
उदाहरण के लिए, आपके पहले कोड के साथ मुख्य मुद्दा यह है कि पॉइंटर को कभी भी डिलीट नहीं किया जाता है जो वास्तव में, वास्तव में खराब है। कहो, आप इसे ठीक कर देंगे:
class Test
{
int* ptr; // writing this in one line is meh, not sure if even standard C++
Test() : ptr(new int(10)) {}
~Test() {delete ptr;}
};
int main()
{
Test o;
Test t = o;
}
यह भी बुरा है। क्या होता है, अगर आप नकल करते हैं Test? दो वर्ग होंगे जिनमें एक संकेतक होगा जो एक ही पते पर इंगित करता है।
जब एक Testनष्ट हो जाता है, तो यह सूचक को भी नष्ट कर देगा। जब आपका दूसरा Testनष्ट हो जाता है, तो यह सूचक के पीछे की मेमोरी को हटाने की कोशिश करेगा, साथ ही साथ। लेकिन इसे पहले ही डिलीट कर दिया गया है और हमें कुछ खराब मेमोरी एक्सेस रनटाइम एरर (या अगर हम अनलकी हैं तो अपरिभाषित व्यवहार) मिलेगा।
तो, सही तरीका यह है कि या तो कॉपी कंस्ट्रक्टर और कॉपी असाइनमेंट ऑपरेटर को लागू किया जाए, ताकि व्यवहार स्पष्ट हो और हम एक कॉपी बना सकें।
unique_ptrयहाँ हमारे आगे रास्ता है। इसका अर्थ अर्थ होता है: " मैं हूँ unique, इसलिए तुम मुझे कॉपी नहीं कर सकते। " इसलिए, यह हमें अब ऑपरेटरों को लागू करने की गलती से रोकता है।
आप विशेष व्यवहार के लिए कॉपी कंस्ट्रक्टर और कॉपी असाइनमेंट ऑपरेटर को परिभाषित कर सकते हैं और आपका कोड काम करेगा। लेकिन आप ऐसा करने के लिए मजबूर हैं, (इसलिए!)।
कहानी का नैतिक: हमेशा unique_ptrइस तरह की स्थितियों में उपयोग करें ।