क्या यह कोड सही है?क्या अद्वितीय_ptr :: रिलीज() विनाशक को कॉल करता है?
auto v = make_unique<int>(12);
v.release(); // is this possible?
क्या यह कच्चे सूचक के delete
के बराबर है?
क्या यह कोड सही है?क्या अद्वितीय_ptr :: रिलीज() विनाशक को कॉल करता है?
auto v = make_unique<int>(12);
v.release(); // is this possible?
क्या यह कच्चे सूचक के delete
के बराबर है?
नहीं, कोड मेमोरी रिसाव का कारण बनता है। release
लेकिन हटाया नहीं प्रबंधित वस्तु के मालिकाना हक को रिहा करने का प्रयोग किया जाता है: जब तक आप एक सुरक्षा तंत्र के बिना कच्चे स्मृति को धोखा देना एक अच्छा कारण है
auto v = make_unique<int>(12); // manages the object
int * raw = v.release(); // pointer to no-longer-managed object
delete raw; // needs manual deletion
ऐसा मत करो।
ऑब्जेक्ट को हटाने के लिए, reset
का उपयोग करें।
auto v = make_unique<int>(12); // manages the object
v.reset(); // delete the object, leaving v empty
एक पूरी तरह से विषय टेंगेंट के रूप में, मैंने लोगों को 'int * raw' और 'int * raw' लिखते हुए देखा है, लेकिन पहली बार मैंने' int * raw' – CoryKramer
@ साइबर देखा है: यह स्वाद का विषय है। मैं पॉइंटर क्वालीफायर को टाइप या वैरिएबल के लिए "संलग्न" होने के रूप में नहीं मानता, इसलिए मैं इसे किसी भी तरह से संलग्न नहीं करता हूं। –
यदि यह दुखद लगता है कि उन्होंने इन फ़ंक्शन नामों का उपयोग करने का निर्णय लिया है। 'डिलीच' जैसी कुछ 'रिलीज' की तुलना में बहुत कम भ्रामक होगी। – minexew
release
आपके कच्चे सूचक को रिसाव करेगा क्योंकि आप इसे किसी भी चीज़ को असाइन नहीं करते हैं।
यह मतलब है की तरह
int* x = v.release();
v
नहीं रह गया है कि सूचक के जीवनकाल प्रबंध कर रहा है, यह x
के लिए कच्चे सूचक स्वामित्व सौंपने है जिसका मतलब है कुछ के लिए प्रयोग की जाने वाली। यदि आप कुछ भी निर्दिष्ट किए बिना release
, तो आप कच्चे सूचक को रिसाव करते हैं।
क्या यह कोड सही है?
नहीं! यह रिसाव होगा।
release()
बस कॉलिंग कोड को उस स्मृति के स्वामित्व को दोबारा लेने दें जब तक इसे unique_ptr
कहा जाता था। यदि आप release()
द्वारा लौटाए गए पॉइंटर को असाइन नहीं करते हैं, तो आपके पास केवल एक रिसाव होगी।
unique_ptr
के लिए एक स्पष्ट हटावट reset()
होगी। लेकिन याद रखें कि unique_ptr
वहां हैं ताकि आपको सीधे उनके द्वारा प्रबंधित स्मृति को प्रबंधित करने की आवश्यकता न हो। यही है, आपको पता होना चाहिए कि एक unique_ptr
स्कोप से बाहर होने के बाद अपने अंतर्निहित कच्चे सूचक को सुरक्षित रूप से हटा देगा।
तो आपके पास स्वचालित मेमोरी प्रबंधन ऑब्जेक्ट पर मैन्युअल मेमोरी प्रबंधन करने का बहुत अच्छा कारण होना चाहिए।
क्या यह कोड सही है?
सं उपयोग std::unique_ptr<>::reset()
आंतरिक कच्चे सूचक को हटाने के लिए:
auto v = std::make_unique<int>(12);
v.reset(); // deletes the raw pointer
उसके बाद किया जाता है, std::unique_ptr<>::get()
वापस आ जाएगी nullptr
(जब तक आप std::unique_ptr<>::reset()
करने के लिए एक गैर nullptr
पैरामीटर प्रदान की गई)।
यह मनमाना प्रकार के लिए थोड़ा मुश्किल हो सकता है:
unique_ptr<Foo> v = get_me_some_foo(); // manages the object
Foo * raw = v.release(); // pointer to no-longer-managed object
delete raw;
लगभग सही है।
unique_ptr<Foo> v = get_me_some_foo(); // manages the object
Foo * ptr = v.release(); // pointer to no-longer-managed object
v.get_deleter() (ptr);
यह सभी स्थितियों में सही होगा; प्रकार फू पर परिभाषित एक कस्टम डिलीटर हो सकता है, लेकिन unique_ptr ऑब्जेक्ट द्वारा लौटाई गई डिलीटर का उपयोग सभी मामलों के लिए अच्छा है।
@ माइकसेमोर हाँ, धन्यवाद! – 0x499602D2