C ++新手:创建2D数组并具有正确的赋值运算符:分段错误

时间:2018-02-01 18:56:57

标签: c++ arrays c++11 assignment-operator

我是c ++的新手,我必须使用指针创建一个2D数组。我已完成数组的创建,但由于“分段错误”,我在初始创建矩阵后无法运行任何内容。我相信这是来自我的任务操作员,但我不确定。这可能来自复制构造函数,但因为我们必须使用指针而丢失了。任何帮助将不胜感激。

#ifndef My_Matrix_H
#define My_matrix_H
#include "My_matrix.h"
#include <stdexcept>

My_matrix::My_matrix() //contructor
{
n = 0;
m = 0;
ptr = NULL;
}

My_matrix::My_matrix(int n1, int m1) //creation of the matrix
{

ptr = new int*[n1];
for (int i = 0; i < n1; i++)
{
    ptr[i] = new int[m1];
    for (int j = 0; j < m1; j++)
    {
        ptr[i][j] = 0;
    }
}

}

My_matrix::My_matrix(const My_matrix& mat) //copy constructor
{

    n = mat.n;
    m = mat.m;
    ptr = new int*[n];
    for (int i = 0; i < n; i++)
    {
        ptr[i] = new int[m];
        for (int j = 0; j < m; j++)
        {
            ptr[i][j] = mat.ptr[i][j];
        }
    }

}

My_matrix::~My_matrix() //destructor
{
    for (int i = 0; i < n; i++)
    {
        delete[] ptr[i];
    }
    delete[] ptr;
}

My_matrix& My_matrix::operator=(const My_matrix& mat) //assignmemt operator
{

    n = mat.n;
    m = mat.m;
    ptr = new int*[n];
    cout << "1" << endl;
    for (int i = 0; i < n; i++)
    {
        cout << "2" << endl;
        ptr[i] = new int[m];
        for (int j = 0; j < m; j++)
        {
            cout << "3" << endl;
            ptr[i][j] = mat.ptr[i][j];
        }
    }

}

void My_matrix::elemset(int i, int j, int num) //puts stuff into matrix
{
ptr[i][j] = num;
}
}#endif

2 个答案:

答案 0 :(得分:1)

[1]在My_matrix(int,int)成员中nm未设置(如果您调用这些成员中的任何一个(复制构造函数,赋值运算符或析构函数),则会导致所有问题)在My_matrix(int,int)创建对象而不设置n,m后,您的应用程序必须崩溃)。

[2] My_matrix::operator=应该返回*this

[3]在My_matrix::operator=中,您应删除以前分配的数据。

答案 1 :(得分:0)

答案。复制/交换是最有效的,正如@PaulMcKenzie给出的那样。

My_matrix& My_matrix::operator=(const My_matrix& mat) 

{ 

 My_matrix temp(mat); 
 std::swap(n,temp.n);
 std::swap(m, temp.m);
 std::swap(ptr, temp.ptr); 
 return *this;

}