【问题标题】:C++ Segmentation Fault (core dump) when Using dynamic 2D array使用动态二维数组时的 C++ 分段错误(核心转储)
【发布时间】:2016-05-20 17:14:04
【问题描述】:

对于作业,我需要能够乘以用户输入的矩阵。为了保存矩阵,我使用了 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 运行它。

【问题讨论】:

  • 请发minimal reproducible example。在执行此操作之前,还要使用调试器逐步检查您的程序以缩小错误来源。
  • 顺便说一句 delete value_array[i]; 应该是 delete[] value_array[i]; 并且您提供的代码对于您提出的问题并不完整。
  • 为什么不使用 c++ 为您提供的容器而不是 ** 东西?

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


【解决方案1】:

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

【讨论】:

  • 非常感谢!我有点想是这样的,我想我只是需要一双额外的眼睛。 IOU 一个 PaulMcKenzie
猜你喜欢
  • 1970-01-01
  • 2021-08-04
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
  • 2022-01-14
相关资源
最近更新 更多