2012-07-25 22 views
5

मेरे पास एक टेम्पलेटेड क्लास है, मायफू, जो टाइप टी के "सामान" को स्टोर करता है जो जटिल प्रकारों के लिए आदिम या पॉइंटर्स हो सकता है। जब myFoo हटा दिया जाता है, तो मैं संग्रहीत होने वाली हर चीज़ से जुड़ी सभी मेमोरी को रिलीज़ करना चाहता हूं। इसका मतलब है कि मुझे संग्रहित होने वाले प्रत्येक पॉइंटर पर डिलीट कॉल करने की आवश्यकता है, लेकिन मैं आदिम पर कॉलिंग को भी समाप्त कर सकता हूं। क्या यह सुरक्षित है ??क्या मैं प्राइमेटिव्स पर डिलीट कॉल कर सकता हूं?

मैंने आगे बढ़ने के लिए बेहतर तरीके से हाइलाइट करने के लिए नीचे myFoo का एक स्केच शामिल किया है। मुझे यकीन नहीं है कि विनाशक का व्यवहार अच्छी तरह परिभाषित है या नहीं।

template<class T> 
class myFoo 
{ 
    public: 
     myFoo(int size) 
     { 
      size_ = size; 
      T* foo = new T[size_]; 
     } 

     void addFoo(T tmp, int index) 
     { 
      foo[index] = tmp; 
     } 

     virtual ~myFoo() 
     { 
      for(int i=0; i < size_; i++) 
      { 
       delete foo[i]; 
      } 
      delete [] foo; 
     } 

    private: 
     int size_; 
     T* foo; 
} 
+0

क्या आप पॉइंटर्स के लिए विशेषज्ञ नहीं हो सकते? – chris

+1

लिखित रूप में, आपका कोड * किसी * प्रकार 'टी' के लिए समझ में नहीं आता है, कम से कम अर्थात्: आप स्वामित्व जिम्मेदारियों को जोड़ रहे हैं, और कक्षा एक उपयोगिता, पठनीयता और रखरखाव दुःस्वप्न होगी। संक्षेप में, यह * आपकी * चिंता नहीं होनी चाहिए जो 'टी' है, और ग्राहक को अपनी सफाई करना चाहिए (या निश्चित रूप से एक स्मार्ट सूचक का उपयोग करना चाहिए)। –

+0

@ केरेकस्क: मैं एक प्रकार का डेटाबेस लिख रहा हूं। मैं इसमें डेटा सम्मिलित करना चाहता हूं। डेटाबेस के लिए यह समझ में आता है कि मैं उस सामान की स्मृति की स्वामित्व लेता हूं जो मैं इसके अंदर संग्रहीत कर रहा हूं। अन्यथा मुझे डेटाबेस से सभी डेटा को बाहरी रूप से प्रबंधित करने की आवश्यकता होगी। यह थोड़ा सा है "wtf ??" यदि आप सुझाव देते हैं तो मैं ऐसा करता हूं। – Daniel

उत्तर

5

एकमात्र चीज जिसे आप delete पर कॉल कर सकते हैं वह एक सूचक प्रकार है। उदाहरण के लिए int पर delete पर कॉल करने में त्रुटि हुई है। यदि आप अपने टेम्पलेट्स को व्यवस्थित करते हैं ताकि आपका कोड किसी त्रुटि को करने का प्रयास कर सके, तो कंपाइलर आपको बताएगा और आपके कोड को संकलित करने से इंकार कर देगा।

तो नहीं, आपको "गलती से" गैर-सूचक को हटाने की चिंता करने की आवश्यकता नहीं है।

+0

तो मैं जिस व्यवहार का वर्णन करता हूं उसे कैसे प्राप्त कर सकता हूं? – Daniel

+0

आप पॉइंटर्स स्टोर करना चाहते हैं या नहीं, इस पर निर्भर करते हुए आप अलग-अलग टेम्पलेट्स प्राप्त कर सकते हैं। या, आप एक स्मार्ट सूचक वर्ग के उदाहरणों को स्टोर कर सकते हैं, और हटाने के लिए स्मार्ट पॉइंटर के विनाशक पर भरोसा कर सकते हैं। –

+0

धन्यवाद ग्रेग। मुझे लगता है कि आप (और अन्य) ने मुझे विश्वास दिलाया है कि स्मार्ट पॉइंटर्स जाने का रास्ता हैं। – Daniel

1

खाका विशेषज्ञता

template <class T> struct delete_it; 

template <class T> struct delete_it<T*> 
{ 
    static void func(T* ptr) { delete ptr; } 
}; 

template <> struct delete_it<int> 
{ 
    static void func(int) {} 
}; 

template <> struct delete_it<double> 
{ 
    static void func(double) {} 
}; 

सभी आदिम प्रकार के लिए दोहराएँ। फिर

virtual ~myFoo() 
    { 
     for(int i=0; i < size_; i++) 
     { 
      delete_it<T>::func(foo[i]); 
     } 
     delete [] foo; 
    } 

अनचेक कोड।

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

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