使用动态2D数组时的C ++分段错误(核心转储)

时间:2016-05-20 17:14:05

标签: c++ arrays matrix dynamic-arrays coredump

对于作业,我需要能够乘以用户输入的矩阵。为了保存矩阵,我使用2D arrays,用户输入的sizes。我初始化大小并创建array,如下所示:

请注意,我尝试使用short来限制值memory的使用量(测试值很可能很大)。

source文件中,constructor(默认构造函数看起来完全相同,除了parametersrows/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正在调用这些functionsvalue_arrayprivate-variable

core dumpmatrix被初始化时发生,或者(如果它很小)在创建包含产品的matrix时发生,这导致我认为它在创作代码中的某个地方。

我正在使用Ubuntu 16.04,使用g++ compiler在终端中运行此功能。

1 个答案:

答案 0 :(得分:4)

您的错误出现在Matrix构造函数中使用的循环中。您正在循环cols值,而不是rows

最终发生的事情是,在Matrix析构函数中,循环遍历内部循环中的行,这样做会导致在可能不存在的行上调用delete

Live Example of Bug

因此:

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];