使用动态二维数组时的 C++ 分段错误(核心转储)
C++ Segmentation Fault (core dump) when Using dynamic 2D array
对于一项作业,我需要能够将用户输入的矩阵相乘。为了保存矩阵,我使用了 2D arrays
,它们的 sizes
由用户输入。我初始化大小并创建 array
如下:
注意,我正在尝试使用 short
来限制值上使用的 memory
的数量(测试值不太可能很大)。
在source
文件中,一个constructor
(默认构造函数看起来相同,只是没有parameters
和rows/cols
被初始化为1
)。
头文件:
short int** value_array;
源文件:
Matrix::Matrix(unsigned int x, unsigned int y)
{
rows = x;
cols = y;
value_array = NULL;
value_array = new short int*[rows];
for (unsigned int i = 0; i < cols; i++)
value_array[i] = new short int[cols];
}
在初始化中 function
:
void Matrix::init(unsigned int x, unsigned int y, short int value)
{
value_array[x][y] = value;
return;
}
destructor
看起来像这样:
Matrix::~Matrix() // destructor
{
for (unsigned int i = 0; i < rows; i++)
delete value_array[i];
delete [] value_array;
}
在main.cpp
文件中,唯一与指针相关的code
就是调用这些functions
。 value_array
是 private-variable
.
core dump
发生在初始化 matrix
或(如果它很小)创建包含乘积后的 matrix
时,这让我认为它是在创建代码的某处。
我在终端中使用 Ubuntu 16.04
、运行 这个 g++
compiler
。
您的错误出在您在 Matrix
构造函数中使用的循环中。您正在遍历 cols
值而不是 rows
。
最终发生的事情是,在您的 Matrix
析构函数中,您循环遍历内部循环中的行,这样做会导致在可能不存在的行上调用 delete
。
因此:
for (unsigned int i = 0; i < cols; i++)
value_array[i] = new short int[cols];
应该是:
for (unsigned int i = 0; i < rows; i++)
value_array[i] = new short int[cols];
另外在你的析构函数中,这个:
delete value_array[i];
应该是:
delete [] value_array[i];
对于一项作业,我需要能够将用户输入的矩阵相乘。为了保存矩阵,我使用了 2D arrays
,它们的 sizes
由用户输入。我初始化大小并创建 array
如下:
注意,我正在尝试使用 short
来限制值上使用的 memory
的数量(测试值不太可能很大)。
在source
文件中,一个constructor
(默认构造函数看起来相同,只是没有parameters
和rows/cols
被初始化为1
)。
头文件:
short int** value_array;
源文件:
Matrix::Matrix(unsigned int x, unsigned int y)
{
rows = x;
cols = y;
value_array = NULL;
value_array = new short int*[rows];
for (unsigned int i = 0; i < cols; i++)
value_array[i] = new short int[cols];
}
在初始化中 function
:
void Matrix::init(unsigned int x, unsigned int y, short int value)
{
value_array[x][y] = value;
return;
}
destructor
看起来像这样:
Matrix::~Matrix() // destructor
{
for (unsigned int i = 0; i < rows; i++)
delete value_array[i];
delete [] value_array;
}
在main.cpp
文件中,唯一与指针相关的code
就是调用这些functions
。 value_array
是 private-variable
.
core dump
发生在初始化 matrix
或(如果它很小)创建包含乘积后的 matrix
时,这让我认为它是在创建代码的某处。
我在终端中使用 Ubuntu 16.04
、运行 这个 g++
compiler
。
您的错误出在您在 Matrix
构造函数中使用的循环中。您正在遍历 cols
值而不是 rows
。
最终发生的事情是,在您的 Matrix
析构函数中,您循环遍历内部循环中的行,这样做会导致在可能不存在的行上调用 delete
。
因此:
for (unsigned int i = 0; i < cols; i++)
value_array[i] = new short int[cols];
应该是:
for (unsigned int i = 0; i < rows; i++)
value_array[i] = new short int[cols];
另外在你的析构函数中,这个:
delete value_array[i];
应该是:
delete [] value_array[i];