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

C++ Segmentation Fault (core dump) when Using dynamic 2D array

对于一项作业,我需要能够将用户输入的矩阵相乘。为了保存矩阵,我使用了 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 dump 发生在初始化 matrix 或(如果它很小)创建包含乘积后的 matrix 时,这让我认为它是在创建代码的某处。

我在终端中使用 Ubuntu 16.04、运行 这个 g++ compiler

您的错误出在您在 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];