使用动态二维数组时的 C++ 分段错误(核心转储)
Posted
技术标签:
【中文标题】使用动态二维数组时的 C++ 分段错误(核心转储)【英文标题】:C++ Segmentation Fault (core dump) when Using dynamic 2D array 【发布时间】: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++ 为您提供的容器而不是 **
东西?
【参考方案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以上是关于使用动态二维数组时的 C++ 分段错误(核心转储)的主要内容,如果未能解决你的问题,请参考以下文章
C++ 从 unsigned char* 到 stringstream:分段错误(核心转储)错误 [关闭]