2012-12-25 17 views
6

unique_ptr मैं एक साधारण noob सवाल है कि मैं करने के लिए एक जवाब नहीं मिल सकता है मिल गया है:Convert वस्तु एसटीडी ::

C++ में कैसे आप एक में एक नियमित रूप से वस्तु

int i; 

परिवर्तित std::unique_ptr?

std::unique_ptr<int> iptr = &i; //invalid 
std::unique_ptr<int> iptr = static_cast<std::unique_ptr<int>>(&i); //invalid 

धन्यवाद।

उत्तर

11

आप नहीं करते हैं। उस ऑब्जेक्ट को delete द्वारा हटाया नहीं जा सकता है, जो unique_ptr ऐसा करने जा रहा है। आप

auto iptr = make_unique<int>(); 

जरूरत है यहाँ, हम एक उपयोगिता समारोह make_shared के समान है, जो मानक किया जाना चाहिए था लेकिन दुर्भाग्य से अनदेखा किया गया के रूप में make_unique परिभाषित करते हैं। संक्षेप में कार्यान्वयन यहां दिया गया है:

template<typename T, typename... Args> std::unique_ptr<T> make_unique(Args&&... args) { 
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); 
} 
+0

हालांकि पूर्णता के लिए समारोह अच्छा होगा, लेकिन मुझे नहीं लगता कि इसे आवश्यकतानुसार बहुत अनदेखा किया गया था। याद रखें कि make_shared एक बार में दो ऑब्जेक्ट्स आवंटित करने की समस्या हल करता है (कोई समकक्ष कन्स्ट्रक्टर नहीं है), जबकि unique_ptr को इसकी आवश्यकता नहीं है (इसमें डिज़ाइन द्वारा शून्य ओवरहेड है)। –

+0

यह सच नहीं है। यदि आप एक फ़ंक्शन कॉल में दो अद्वितीय_ptrs बनाते हैं, तो अभी भी अपवाद असुरक्षित है, उदाहरण के लिए, जो make_unique बचाता है। – Puppy

+0

क्या आप उस बिंदु पर सीधे unique_ptr बनाकर उस से बच नहीं सकते हैं? 'func (unique_ptr (नया टी), unique_ptr (नया यू))' –

4

आप नहीं करते हैं। i को गतिशील रूप से आवंटित नहीं किया गया था इसलिए इसे हटाने की आवश्यकता नहीं है। यदि आपने अपने पते के चारों ओर एक स्मार्ट पॉइंटर लपेट लिया है, तो यह किसी बिंदु पर delete &i करेगा और आपको अपरिभाषित व्यवहार देगा। आप केवल कुछ लपेट चाहिए तुम इतनी तरह एक स्मार्ट सूचक में new एड है,:

std::unique_ptr<int> ptr(new int(5)); 

एक स्मार्ट सूचक के पूरे मुद्दे है कि यह आप के लिए एक गतिशील आवंटित वस्तु के जीवनकाल का प्रबंधन करता है। i में स्वचालित संग्रहण अवधि है इसलिए इसे अपने दायरे के अंत में नष्ट कर दिया जाएगा। आपको इसके साथ मदद करने के लिए कुछ भी नहीं चाहिए।

0

जब अनन्य_प्टर नष्ट हो जाएगा तो क्या होगा? या दूसरी तरफ, जब चर का दायरा खत्म हो जाता है?

int i; 
auto deleter = [](int *ptr){}; 
std::unique_ptr<int, decltype(deleter)> iptr(&i, deleter); 

आपको लगता है कि कुछ नहीं करता है एक कस्टम Deleter प्रदान करने के लिए: यह कोई मतलब नहीं वास्तव में

1

मेरा मानना ​​है कि यह काम करेगा बनाता है। डिफ़ॉल्ट डिलीटर new द्वारा आवंटित नहीं किए गए एक स्वचालित चर को हटा नहीं सकता है। (हालांकि, यह एक स्मार्ट सूचक का उपयोग करने के उद्देश्य को हरा देता है, लेकिन यह दिखाता है कि यह संभव है)।

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