【问题标题】:Creating a destructor for a template class(2d dynamic) that has many friend functions c++为具有许多友元函数c ++的模板类(2d动态)创建析构函数
【发布时间】:2012-09-05 00:12:48
【问题描述】:

我在为具有私有二维动态数组的模板类创建析构函数时遇到问题。出于某种原因,一旦我将信息输入到矩阵中,析构函数就会破坏矩阵。不知道出了什么问题,因为它编译得很好,但是当我输入前 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;
            }

【问题讨论】:

标签: c++ arrays templates dynamic destructor


【解决方案1】:

如果没有看到确切的代码和调用代码,很难判断,但这可能是因为你缺少复制构造函数和赋值运算符。

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是什么?

【讨论】:

    【解决方案2】:

    我认为 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。

    【讨论】:

    • 可悲的是,这完全忽略了T 的对齐方式。并且typename T 与模板参数中的class T 完全相同。
    • 如果您担心对齐,请使用两个 new 调用而不是一个 malloc 和/或引入填充。在实践中,所描述的方法一直对我有用。对反对票感到失望,但没关系。正如我所说,这是一条评论(带有代码),而不是答案。
    • 我会记住这一点以备将来使用,但现在可能为时已晚。
    猜你喜欢
    • 2013-02-18
    • 2010-12-19
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多