【发布时间】:2020-05-13 10:20:22
【问题描述】:
我遇到了分段错误,希望能帮助我了解我做错了什么。
在我的代码运行一段时间后,我收到了一个核心转储: 程序以信号 SIGSEGV 终止,分段错误。
struct config {
int a;
int b;
int c;
int d;
};
static config* configuration_table = NULL;
void Album::caller() {
replay(2, configuration_table, 0, false);
}
int Album::replay(int count, config*& config_tbl, unsigned int& config_sz, bool send) {
int num_elems =0;
...
...
...
err = get_num_elems(&num_elems);
if (err) {
return -1;
}
if (!num_elems) {
return -1;
}
if (config_tbl) {
delete[] config_tbl;
config_tbl = NULL;
config_sz = 0;
}
config_tbl = new config[num_elems];
if (!config_tbl) {
return -1;
}
}
gdb:
4 0xf9abd319 in Album::replay (this=0xa693955, count=2, config_tbl=@0xf9d4299e: 0x0, config_sz=@0xa3039fe: 0, send=false)
从回溯看来,问题在于来自“config_tbl = new config[num_elems];”的运算符“new”的 malloc。 我调试时 num_elems 的大小为 15。
我不明白我做错了什么。会不会是系统内存不足?
【问题讨论】:
-
请附上minimal reproducible example。崩溃的原因不一定与崩溃在同一个地方
-
@idclev463035818 这是最小的可重复性。我已经删除了所有不相关的内容(函数参数除外)
-
不,它是不可复制的。要编译它,我需要定义
Album,我必须删除一些...(同时想知道它们为什么在那里)。也许这不是重现问题所必需的,我不知道,但你知道 -
您必须在某处初始化
config_tbl。您发布的代码假定它是nullptr或有效指针。如果你不觉得那是个问题 -
@idclev463035818 "..." 用于表示中间有很多代码,我看不出“专辑”的定义与此有何关系。内存有问题,因为我提供了发生分段错误的所有相关变量,所以不需要编译。我怀疑“...”中有一个分配被我的新分配超出,但不确定为什么会发生 - 也许我对内存分配不够熟悉,这就是我寻求帮助的原因。