2014-09-01 6 views

उत्तर

58

नहीं, कोड मेमोरी रिसाव का कारण बनता है। 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 
+2

एक पूरी तरह से विषय टेंगेंट के रूप में, मैंने लोगों को 'int * raw' और 'int * raw' लिखते हुए देखा है, लेकिन पहली बार मैंने' int * raw' – CoryKramer

+10

@ साइबर देखा है: यह स्वाद का विषय है। मैं पॉइंटर क्वालीफायर को टाइप या वैरिएबल के लिए "संलग्न" होने के रूप में नहीं मानता, इसलिए मैं इसे किसी भी तरह से संलग्न नहीं करता हूं। –

+4

यदि यह दुखद लगता है कि उन्होंने इन फ़ंक्शन नामों का उपयोग करने का निर्णय लिया है। 'डिलीच' जैसी कुछ 'रिलीज' की तुलना में बहुत कम भ्रामक होगी। – minexew

10

release आपके कच्चे सूचक को रिसाव करेगा क्योंकि आप इसे किसी भी चीज़ को असाइन नहीं करते हैं।

यह मतलब है की तरह

int* x = v.release(); 

v नहीं रह गया है कि सूचक के जीवनकाल प्रबंध कर रहा है, यह x के लिए कच्चे सूचक स्वामित्व सौंपने है जिसका मतलब है कुछ के लिए प्रयोग की जाने वाली। यदि आप कुछ भी निर्दिष्ट किए बिना release, तो आप कच्चे सूचक को रिसाव करते हैं।

11

क्या यह कोड सही है?

नहीं! यह रिसाव होगा।

release() बस कॉलिंग कोड को उस स्मृति के स्वामित्व को दोबारा लेने दें जब तक इसे unique_ptr कहा जाता था। यदि आप release() द्वारा लौटाए गए पॉइंटर को असाइन नहीं करते हैं, तो आपके पास केवल एक रिसाव होगी।

unique_ptr के लिए एक स्पष्ट हटावट reset() होगी। लेकिन याद रखें कि unique_ptr वहां हैं ताकि आपको सीधे उनके द्वारा प्रबंधित स्मृति को प्रबंधित करने की आवश्यकता न हो। यही है, आपको पता होना चाहिए कि एक unique_ptr स्कोप से बाहर होने के बाद अपने अंतर्निहित कच्चे सूचक को सुरक्षित रूप से हटा देगा।

तो आपके पास स्वचालित मेमोरी प्रबंधन ऑब्जेक्ट पर मैन्युअल मेमोरी प्रबंधन करने का बहुत अच्छा कारण होना चाहिए।

12

क्या यह कोड सही है?

सं उपयोग 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 पैरामीटर प्रदान की गई)।

1

यह मनमाना प्रकार के लिए थोड़ा मुश्किल हो सकता है:

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 ऑब्जेक्ट द्वारा लौटाई गई डिलीटर का उपयोग सभी मामलों के लिए अच्छा है।

संबंधित मुद्दे