【问题标题】:Segmentation fault after free(), what are the common causes for this?free() 后出现分段错误,常见的原因是什么?
【发布时间】:2011-01-19 10:28:07
【问题描述】:

free指定某个指针后出现分段错误:

free(studentDB->name);

我可以在没有任何错误或警告的情况下获得它的值:

printf("[DBG] studentDB->name: %s\n", studentDB->name);

但是,正如我所说,当我尝试释放程序时,程序崩溃了。 free 命令导致分段错误的最常见原因是什么?

【问题讨论】:

    标签: c free segmentation-fault


    【解决方案1】:

    如果你没有malloc()它,你就不能free()它。 studentDB->name来自哪里?

    【讨论】:

    • 或者你尝试释放它两次。我认为更常见。
    • 正确。这是一个指针,但我没有使用malloc 为其分配内存。
    【解决方案2】:

    您可能已经对其进行了 free() 处理,或者使用缓冲区溢出覆盖了块之前的 malloc 信息

    【讨论】:

    • 缓冲区溢出问题解决了我的问题,我什至没有寻找它,因为在释放之前没有内存错误。
    【解决方案3】:

    来自free 的段错误可能是由于在未分配malloc 或已分配free 的指针上调用它引起的。

    如果您发布分配studentDB->name 的代码会有所帮助。

    【讨论】:

      【解决方案4】:

      通常在程序的其他地方堆损坏。堆通常是连续的,堆管理器将堆块与标题包围起来以跟踪块-如果覆盖块的标题,则可以访问它,但free 很可能会失败。

      【讨论】:

        【解决方案5】:

        studentDB->name 之前是否已分配?如果您没有为该字段分配内存,那么当您调用free 时,您可能会遇到段错误!请检查该字段并确保它是mallocd 或strdupd。

        或者堆上的其他地方存在损坏,正如您正确指出的那样,您可以看到name的值...

        希望这会有所帮助, 最好的祝福, 汤姆。

        【讨论】:

          【解决方案6】:

          如果 studentDB 为 NULL,访问 studentDB 指针的 name 成员也可能是一个段错误。

          【讨论】:

            【解决方案7】:

            来自手册页:

            free( ptr ) 释放内存空间 由 ptr 指向,它必须有 被先前的调用返回 malloc()、calloc() 或 realloc()。 否则,或者如果 free(ptr) 已经 之前被调用过,未定义 行为发生。如果 ptr 为 NULL,则否 执行操作。

            也可以查看:

            1. studentDB 是指向包含成员“名称”的类/结构的非 NULL 指针吗?
            2. studentDB->name 指向的空间是否被 malloc/calloc/realloc 返回?

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-04-09
              • 2013-06-16
              • 1970-01-01
              • 1970-01-01
              • 2020-11-05
              相关资源
              最近更新 更多