2012-09-12 22 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