C ++重载动态多维数组错误的赋值运算符

时间:2015-07-04 02:35:22

标签: c++ overloading assignment-operator rule-of-three

我在使用动态数组重载=运算符时遇到了麻烦。这就是我到目前为止所拥有的。另外我知道我没有写过我的析构函数或构造函数,但我需要首先关注这个运算符:

在我的标题文件中:

#ifndef fasdf_dynn_h
#define fasdf_dynn_h

#include <iostream>
#include <fstream>
#include<string>
#include <cstdlib>
#include <vector>

using namespace std;
template <class T>

class MatrixdynVector{

public:
    template <class H>
    MatrixdynVector<H>& operator =(const MatrixdynVector<H>& c)
    {
        if (this == &c)//checks for self assignment
        {
            return *this;
        }
        else
        {
          delete [] matrix;
          matrix=new int[c.m*n];
          this->m=c.m;
          this->n=c.n;
          return *this;

        }
    }
private:
    int m,n;
    int** matrix;
};


#endif

1 个答案:

答案 0 :(得分:0)

我现在只看到重大问题;

第一,您正在为新数据阵列分配c.m * this-&gt; n内存,我假设您要分配c.m * c.n内存。

最后,我强烈建议您仔细查看复制构造函数,因为delete函数在返回此类矩阵时可能会导致数据损坏。

具体来说,如果你曾经在堆栈上分配这个类,不要创建一个复制的复制构造函数,并且不要确保你总是返回一个副本,对象的数据将是删除(我假设你最后会删除析构函数中的[]&#39;矩阵&#39;并且返回的对象将具有&#39; matrix&#39;指向已删除的数据。当我创建自己的矩阵类时,我遇到了这个问题。

如果您确实想要一个多维数组,可以像这样创建它;

matrix = new int*[c.m];
for (int i = 0; i < c.m; i++)
  matrix[i] = new int[c.n]; // create a multi dimensional array

for (int i = 0; i < c.m; i++)
  for (int j = 0; j < c.n; j++)
    matrix[i][j] = c.matrix[i][j]; // add data to it

我差点忘了,对于析构函数,你也需要用for循环删除矩阵;

for (int i = 0; i < c.m; i++)
  delete[] matrix[i]; // delete the second dimension of the matrix

delete[] matrix; // delete the first

下面是一个复制构造函数的例子

MatrixdynVector<H>::MatrixdynVector(const MatrixdynVector<H>& oMat)
  : m(oMat.m), n(oMat.n), matrix(new int*[oMat.m]){
  for (int i = 0; i < m; i++){
    matrix[i] = new int[n];
    for (int j = 0; j < n; j++)
      matrix[i][j] = oMat.matrix[i][j];
  }
}

这个拷贝构造函数最重要的部分是参数是const&amp; type - 如果不这样做,则调用将变为递归 - 并且正在进行重复。每当动态分配的内存属于一个对象时,必须非常小心,以确保它有一个复制构造函数,每次调用它时都会分配新内存,否则默认构造函数也只是将内存的所有权赋予副本,从而导致它将与副本一起删除。您还应该注意,应尽可能使用引用来传递此类型的对象,因为使用副本重新分配内存非常昂贵。