2012-08-15 106 views
0

嗯,我正在學習的模板和,我有下一個代碼問題:刪除[]析構函數

 #include <iostream> 

     using namespace std; 

     template<class T, int n> 
     class Table 
     { 
     public: 
      Table(); 
      //~Table(); 
      int& operator[](int i); 
      bool Resize(int n); 
      int Count(); 
      void Free(); 

     private: 
      T* inst; 
      int count; 
     }; 

     template<class T, int n> 
     Table<T, n>::Table() 
     { 
      inst = new T[n]; 
      count = n; 
     } 

     template<class T, int n> 
     void Table<T, n>::Free() 
     { 
      delete[] this->inst; 
     } 

     template<class T, int n> 
     int& Table<T, n>::operator[](int i) 
     { 
      return inst[i]; 
     } 

     template<class T, int n> 
     bool Table<T, n>::Resize(int n) 
     { 
      this->inst = (T*)realloc(this->inst, sizeof(T)*count + sizeof(T)*n); 
      if(!inst) 
       return false; 

      return true; 
     } 

     template<class T, int n> 
     int Table<T, n>::Count() 
     { 
      return this->count; 
     } 

     template<typename T, int n> void ShowTable(Table<T, n> t) 
     { 
      for(int i=0; i<t.Count(); i++) 
       cout<<t[i]<<endl; 
     } 

     int main() 
     { 
      Table<int, 2> table; 
      table[0] = 23; 
      table[1] = 150; 
      ShowTable(table); 

      system("pause"); 
      table.Free(); 

      return 0; 
     } 

它的工作原理,但是,當我把delete[] this->inst;在析構函數,它拋出我一個聲明失敗,我不知道爲什麼......我的意思是,刪除析構函數中的資源是不好的?

回答

1

你有以下方法定義一個重複的標識n

template<class T, int n> 
    bool Table<T, n>::Resize(int n) 

我得到一個錯誤上述聲明編譯,我很驚訝你沒有。您需要將其中一個int n重命名爲其他內容(如Resize(int newsize))。

在析構函數中刪除inst成員沒有問題。這是你應該做的,以避免內存泄漏。

+0

謝謝,但我改變了該參數的名稱,我仍然得到斷言失敗時,我寫:delete [] this-> inst;在析構函數的定義 – German 2012-08-15 01:48:37

+0

您的代碼在更改參數的名稱後爲我工作。你得到的實際信息是什麼? (斷言失敗的消息通常附帶* some * detail) – 2012-08-15 01:50:03

+0

它引發了我「Expression _BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)」dbgdel.cpp line:52 – German 2012-08-15 01:51:39