2013-03-13 4 views
9

के रूप में कस्टम डिलीटर के साथ std :: unique_ptr का उपयोग करना मेरे पास एक सामान्य वर्ग myClass है जिसे कभी-कभी उपयोग के आधार पर अतिरिक्त राज्य जानकारी संग्रहीत करने की आवश्यकता होती है। यह आमतौर पर void* के साथ किया जाता है, लेकिन मैं सोच रहा था कि क्या मैं std::unique_ptr<void, void(*)(void*)> का उपयोग कर सकता हूं ताकि क्लास इंस्टेंस नष्ट होने पर स्मृति स्वचालित रूप से रिलीज़ हो। समस्या यह है कि मुझे अपरिभाषित व्यवहार में एक शून्य * परिणाम हटाने के रूप में एक कस्टम डिलीटर का उपयोग करने की आवश्यकता है। एक स्मार्ट शून्य *

क्या std::unique_ptr<void, void(*)(void*)> डिफॉल्ट बनाने का कोई तरीका है, इसलिए मैंने इसे पहले डमी डिलीटर के साथ नहीं बनाया है, फिर जब मैं void* का उपयोग किसी राज्य संरचना के लिए करता हूं तो वास्तविक डिलीटर सेट करता है? या क्या कक्षा में राज्य की जानकारी स्टोर करने का एक बेहतर तरीका है?

void dummy_deleter(void*) { } 

class myClass 
{ 
public: 
    myClass() : m_extraData(nullptr, &dummy_deleter) { } 
    // Other functions and members 
private: 
    std::unique_ptr<void, void(*)(void*)> m_extraData; 
}; 
+7

हमारे पास टेम्पलेट्स होने पर 'शून्य' पॉइंटर्स के लिए वास्तव में बहुत अधिक उपयोग नहीं है। –

+3

यह एक [xy समस्या] की तरह लगता है (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)। – Pubby

+0

क्या आप वाकई 'unique_ptr' चाहते हैं, और' shared_ptr' नहीं? –

उत्तर

6

शायद अतिरिक्त जानकारी स्टोर करने के लिए एक आभासी नाशक के साथ एक अंतरफलक IAdditionalData के लिए होगा एक अधिक सहज तरीका:

यहां कुछ नमूना कोड है। आपके पास जो भी डेटा संरचनाएं हो सकती हैं IAdditionalData से प्राप्त होगी और std::unique_ptr<IAdditionalData> में संग्रहीत की जाएगी।

यह थोड़ा और प्रकार की सुरक्षा भी प्रदान करता है, क्योंकि आप void * और जो भी डेटा प्रकार के बीच reinterpret_cast के बजाय IAdditionalData और वास्तविक प्रकार के बीच स्थैतिक भूमिका निभाएंगे।

+0

आप शून्य * और लक्ष्य प्रकार के बीच भी static_cast कर सकते हैं। –

+0

@ आर। मार्टिनिन्हो फर्नांडीस आप शून्य * और किसी भी प्रकार के बीच static_cast कर सकते हैं। यह कोई प्रकार की सुरक्षा गारंटी प्रदान करता है। एक इंटरफेस के विरोध में। –

+0

IDdditionalData से statD_cast कुछDerivedAdditionalData कुछ डीरियड एडडिशनल डेटा को शून्य से अधिक सुरक्षित नहीं है, हालांकि (कम से कम किसी भी महत्वपूर्ण तरीके से नहीं)। –

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