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)
中,成员 n
和 m
未设置(这是所有问题的根源,如果您调用这些成员中的任何一个(复制构造函数、赋值运算符或析构函数)在没有设置 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;
}
我是 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)
中,成员 n
和 m
未设置(这是所有问题的根源,如果您调用这些成员中的任何一个(复制构造函数、赋值运算符或析构函数)在没有设置 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;
}