2014-10-14 8 views
6

के साथ कस्टम Deleter का उपयोग कर shared_ptr के साथ आप की तरह एक कस्टम Deleter उपयोग कर सकते हैं,:unique_ptr

auto fp = shared_ptr<FILE>(fopen("file.txt", "rt"), &fclose); 
fprintf(fp.get(), "hello\n"); 

और इस fclose करने के लिए फ़ाइल कैसे समारोह बाहर निकलता है की परवाह किए बिना याद रखेंगे। तथापि

auto fp = unique_ptr<FILE>(fopen("file.txt", "rt"), &fclose); 

, कि संकलन नहीं करता है:
हालांकि, यह थोड़ा overkill एक स्थानीय चर refcount करने लगता है, इसलिए मैं unique_ptr उपयोग करना चाहते हैं।

क्या यह एक दोष है? क्या कोई आसान कामकाज है? मैं कुछ तुच्छ याद कर रहा हूँ?

+0

[हो सकता है कि संबंधित] (http उपयोग कर सकते हैं: // codereview। stackexchange.com/questions/4679/shared-ptr-and-file-for-wrapping-cstdio-update-also-dlfcn-h) –

+2

[मतभेद] से सावधान रहें (http://cplusplus.github.io/LWG/ lwg-active.html # 24 15) साझा और अद्वितीय सूचक के बीच जब यह शून्य पॉइंटर्स को हटाने के लिए मिलता है। –

+0

हां, आप कुछ मामूली याद कर रहे हैं: आपने स्पष्ट रूप से यह नहीं देखा है कि 'unique_ptr' कैसे घोषित किया गया है या इसके बारे में कोई भी दस्तावेज पढ़ा गया है –

उत्तर

10

unique_ptr<FILE, int(*)(FILE*)>(fopen("file.txt", "rt"), &fclose); 

http://en.cppreference.com/w/cpp/memory/unique_ptr के बाद से

होना चाहिए या, जब से तुम सी ++ 11 उपयोग करते हैं, आप decltype

std::unique_ptr<FILE, decltype(&fclose)>