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

New to C++: Creating a 2D array and having a correct assignment operator: Segmentation Error

我是 c++ 的新手,我必须使用指针创建一个二维数组。我已经完成了数组的创建,但是由于 "Segmentation fault",在初始创建矩阵之后我无法进行任何操作 运行。我相信这是来自我的赋值运算符,但我不确定。这可能来自复制构造函数,但因为我们必须使用指针,所以我迷路了。任何帮助将不胜感激。

#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

[1] 在 My_matrix(int,int) 中,成员 nm 未设置(这是所有问题的根源,如果您调用这些成员中的任何一个(复制构造函数、赋值运算符或析构函数)在没有设置 n,m 的情况下通过 My_matrix(int,int) 创建对象后,您的应用程序必须崩溃)。

[2] My_matrix::operator= 应该 return *this.

[3] 在 My_matrix::operator= 你应该删除之前分配的数据。

求解答。正如@PaulMcKenzie 给出的那样,copy/swap 最有效。

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;

}