对于作业,我需要能够乘以用户输入的矩阵。为了保存矩阵,我使用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
在终端中运行此功能。
答案 0 :(得分:4)
您的错误出现在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];