2012-09-12 21 views
0

我在創建具有私有2d動態數組的模板類的析構函數時遇到問題。由於某種原因,只要我完成將信息輸入到矩陣中,析構函數就會銷燬矩陣。不知道出了什麼問題,因爲它編譯得很好,但是當我輸入前兩個矩陣的信息並且程序試圖將它們相乘時出錯。代碼的作品,如果我擺脫了析構函數。爲具有許多朋友函數的模板類(2D動態)創建析構函數C++

template <class T> 
class matrix 
{ 
//sudo 
friend matrix operator + , *,-,(bunch of friends used to overload) 
//end sudo 
public: 
       matrix(): rows(0), cols(0){} 
       int Arows(){return rows;} 
       int Acols(){return cols;} 
      class Proxy 
      { 
       matrix& _a; 
       int _i; 
      public: 
       Proxy(matrix& a, int i) : _a(a), _i(i){} 
       int& operator[](int j) {return _a.Array[_i][j];}; 
      }; 
       Proxy operator[](int i) {return Proxy(*this,i);} 
       ~matrix(); 
       private: 
       T ** Array; 
       int rows; 
       int cols; 
       }; 

       template<class T> 
       matrix<T>::~matrix() 
      { 
       for (int i=0;i<rows;i++) 
        delete [] Array[i]; 
       delete [] Array; 
      } 
+6

請參閱[三規則](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three)和[規則零](http://rmartinho.github .COM/2012/08/15 /規則的-zero.html)。 –

+0

感謝他們兩人現在 – blu

回答

0

很難說沒有看到確切的代碼和調用代碼,但它可能是因爲你缺少複製構造函數和賦值運算符。

matrix m1;  
{ 
matrix m2 = ... 
m1 = m2; // copy ctor, now they share same Array pointer 
} // m2 destructor free the Array 

// m1 is left with dangling Array pointer 

從代碼示例它似乎不是真正的代碼。 Array初始化在哪裏,matrixArray是什麼?

-1

我認爲由R. Martinho Fernandes提供的評論回答了這個問題......我想指出其他的東西,我只是將它作爲答案來做,所以我可以對代碼進行格式化。

人們爲了製作二維數組而癡迷於大量的內存分配......但速度很慢!如果你對這些矩陣做了很多工作,你最好做一次內存分配。它去有點像這樣:

Array = (T**)malloc(rows*sizeof(T*) + rows*cols*sizeof(T)); 
T* rowData = (T*)(Array + rows); 
for(int r = 0; r < rows; r++) { 
    Array[r] = rowData; 
    rowData += cols; 
} 

而且當你要釋放此內存:

free((void*)Array); 

當然,我假設你正在使用的基本類型......事實上,你可能會更好在模板中使用typename T而不是class T

哦,是的,這使得它很容易從一個矩陣(相同大小)複製數據到另一個。您只需按上述方式進行分配,然後在數據部分執行一個memcpy

+0

可悲的是,這完全忽略了'T'的排列。在模板參數中'typename T'與*'class T'完全相同。 –

+0

如果您關注對齊,請使用兩個'new'調用,而不是'malloc'和/或引入填充。在實踐中,所描述的方法一直爲我工作。在downvote失望,但從來沒有想過。正如我所說這是一個評論(與代碼),而不是一個答案。 – paddy

+0

我會記住這一點,以備將來使用,但現在可能會遲到。 – blu