0

プライベート 2D 動的配列を持つテンプレート クラスのデストラクタの作成に問題があります。何らかの理由で、マトリックスへの情報の入力が完了するとすぐに、デストラクタがマトリックスを破棄します。コンパイルは正常に行われるため、何が問題なのかわかりませんが、最初の 2 つの行列の情報を入力し、プログラムがそれらを乗算しようとするとエラーが発生します。デストラクタを取り除くと、コードは機能します。

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

2 に答える 2

0

It is hard to tell without seeing the exact code and calling code, but it might be because you are missing copy constructor and assignment operator.

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

from the code sample it doesn't seem like real code. Where is Array initialized, what is matrixArray?

于 2012-09-12T02:16:33.870 に答える
-1

R. Martinho Fernandes によって提供されたコメントがそれに答えていると思います...何か他のことを指摘したかったので、コードをフォーマットできるように純粋に答えとしてやっています。

人々は、2D 配列を作成するためだけに大量のメモリ割り当てを行うことに夢中になります...しかし、それは遅いです! これらの行列で多くのことを行っている場合は、単一のメモリ割り当てを行う方がよいでしょう。次のようになります。

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から、データセクションでシングルを実行します。

于 2012-09-12T02:26:02.917 に答える