分配时出现分段错误[重复]

Posted

技术标签:

【中文标题】分配时出现分段错误[重复]【英文标题】:segmentation fault when allocating [duplicate] 【发布时间】: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 "..." 用于表示中间有很多代码,我看不出“专辑”的定义与此有何关系。内存有问题,因为我提供了发生分段错误的所有相关变量,所以不需要编译。我怀疑“...”中有一个分配被我的新分配超出,但不确定为什么会发生 - 也许我对内存分配不够熟悉,这就是我寻求帮助的原因。 【参考方案1】:

您的代码假定config_tbl 已正确初始化。由于您坚持认为您发布的代码是相关的,我认为它没有正确初始化。

考虑这个简化的例子:

void foo( int* ptr) 
    if (ptr) delete ptr;

如果ptrnullptr 或有效指针(即它指向通过new 创建的int),这很好。正确的用法是

foo(nullptr);

int* x = new int;
foo(x);

但是,让foo 大肆破坏太容易了:

int* x;
foo(x);      // UNDEFINED BEHAVIOR
int y;
foo(&y);     // BOOM

首先不要将指针用于动态数组。请改用std::vector

PS:请注意,虽然foo 是完全错误的代码,但它并没有错。它是可能导致崩溃的调用代码。

【讨论】:

以上是关于分配时出现分段错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章

返回指针时出现分段错误[重复]

链表:将值分配给节点的下一部分时出现分段错误错误

在 C 中创建大型数组时出现分段错误

初始化数组时出现段错误

使用 MATLAB mex 将向量与另一个向量分配时出现分段错误

删除模板数组时出现分段错误[重复]