2012-07-25 36 views
5

我有一個模板類myFoo,它存儲類型T的「東西」,它可以是原始的或指向複雜類型的指針。當myFoo被刪除時,我想釋放所有存儲的相關內存。這意味着我需要調用每個存儲指針的delete,但是我最終也可能會在一個基元上調用delete。這安全嗎?我可以在基元上調用刪除嗎?

我已經在下面添加了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 2012-07-25 05:44:08

+1

正如你寫的,至少在語義上你的代碼對任何*類型'T'都沒有意義:你在混合所有權責任,而這個類將是一個可用性,可讀性和可維護性的噩夢。簡而言之,它不應該是'你'擔心'T'是什麼,客戶應該自己清理(或者使用智能指針)。 – 2012-07-25 05:48:00

+0

@KerrekSB:我正在寫各種數據庫。我想插入數據到它。數據庫對我存儲在其中的東西的內存擁有所有權是有道理的。否則,我需要從外部管理數據庫中的所有數據。這有點「wtf ??」如果我按照你的建議去做。 – Daniel 2012-07-25 05:50:53

回答

5

您唯一能打電話給delete的是指針類型。例如,在int上調用delete是錯誤的。如果您安排模板以便您的代碼嘗試執行某些錯誤,編譯器會讓您知道並拒絕編譯您的代碼。

所以不,你不必擔心「意外」刪除一個非指針。

+0

那麼我如何才能實現我所描述的行爲呢? – Daniel 2012-07-25 05:46:17

+0

您可能有不同的模板,具體取決於您是否要存儲指針。或者,您可以存儲智能指針類的實例,並依靠智能指針的析構函數進行刪除。 – 2012-07-25 05:48:11

+0

謝謝Greg。我認爲你(和其他人)已經說服我,聰明的指針是要走的路。 – Daniel 2012-07-25 08:18:01

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; 
    } 

未經檢查的代碼。

相關問題