मैं सुझाव है कि आप T
के लिए std::unique_ptr
उपयोग करने के लिए जब आप Example
जरूरत है एक मालिक सूचक धारण करने के लिए। यदि T
एक कच्चा सूचक है, तो यह बस स्वामित्व में नहीं है और इसे हटा नहीं देना चाहिए।
यदि आपको पॉइंटर प्रारंभ करने के लिए Example
की आवश्यकता है, तो इसे std::unique_ptr
के लिए विशेषज्ञ बनाएं और डिफ़ॉल्ट निर्माता में std::make_unique
पर कॉल करें।
template<typename T>
class Example<std::unique_ptr<T>> {
Example() : data{std::make_unique<T>()} {}
/* rest of the class */
};
आप ऐसा करते हैं, तो आप अपने वर्ग T*
के लिए एक new
करने के लिए विशेषज्ञ नहीं करना चाहिए, जैसा कि आप गैर मालिक संकेत आरंभ नहीं कर सकते। आपको इसे कन्स्ट्रक्टर में प्राप्त करना चाहिए, और यदि आप इसे शून्य नहीं करना चाहते हैं तो कच्चे पॉइंटर्स के लिए डिफ़ॉल्ट कन्स्ट्रक्टर को अक्षम कर सकते हैं।
template<typename T>
class Example<T*> {
Example() = delete;
Example(T* data_) : data{data_}
/* data is not an owning pointer. No need for a destructor */
/* rest of the class */
};
यदि आप उन नियमों का पालन करते हैं, तो आपको स्मृति प्रबंधन में कोई समस्या नहीं होनी चाहिए।
स्रोत
2016-02-09 16:38:54
ठीक है आप मानक कंटेनर की तरह हो सकते हैं और ऐसा नहीं कर सकते हैं। मानक कंटेनर विनाशक तत्वों के लिए कुछ भी नहीं करेंगे यदि प्रकार एक सूचक प्रकार है। – NathanOliver
संकेत: 'std :: is_pointer' के आस-पास स्थित एक सीआरटीपी नीति प्रकार मुहावरे का उपयोग करें। इसे मज़ेदार बनाने के लिए, फिर पूरी चीज को बिन करें क्योंकि यह वास्तव में * बिंदुओं को गतिशील लोगों से स्वचालित चर के लिए बिंदुओं को अलग करने के लिए मुश्किल है। –
Bathsheba
दोनों वैध अंक। मैं उस पर काम कर रहा हूं जिसे मैं अधिक व्यायाम करने के लिए विचार करता हूं, इसलिए मैं अंततः सोच रहा था कि क्या मुझे कुछ याद आ रहा था, या अगर सामान्य रूप से काम करना मुश्किल था (जो मामला प्रतीत होता है) – nmagerko