【问题标题】:Unknown segmentation fault error未知的分段错误错误
【发布时间】:2015-03-18 13:18:52
【问题描述】:

谁能解释一下这个错误是什么意思?

如果图像不清晰,这是错误:

Main: malloc.c:2372: sysmalloc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 *(sizeof(size_t))) - 1)) & ~((2 *(sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long) old_end & pagemask) == 0)' failed.

【问题讨论】:

  • 请把相关代码贴在这里。
  • 您有一个导致堆损坏的错误 - 在 valgrind 下运行您的代码以找到错误。
  • @PaulR 只是好奇:错误的哪一部分告诉您它必须处理堆损坏? (malloc.c 和/或sysmalloc?)谢谢。
  • 请不要在图片中发布代码。那是错误的。
  • @Unheilig:错误消息在抱怨,因为 malloc 自己用于管理堆的内部数据结构已损坏 - 这通常发生在某些内容写入无效地址时,例如写入悬空/野指针或从数组末尾运行。

标签: c segmentation-fault malloc


【解决方案1】:

这意味着内存分配/释放函数检测到堆中存在严重问题,这意味着继续使用它可能不安全。

要理解这一点,请意识到堆几乎总是由混合在内存中的数据块控制信息组成(并非完全需要,但大多数实现可能会这样做)。

如果您在分配块的末尾之外写入,则可能会损坏一些控制信息,例如:

char *twoBytes = malloc(2);
memset (twoBytes, '\0', 10000);

即使假设在两个字节的末尾有一些可用空间以提高分配效率(作为开发人员,您应该永远假设这一点),写入一万字节几乎肯定会导致一些严重的损坏。

不幸的是,堆中的错误很少在它们发生的位置附近被检测到,因此您需要检查您的代码是否存在超出缓冲区末端的写入位置。另一种选择是使用valgrind 之类的工具来检测可疑写入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-11
    • 2021-01-12
    • 2020-01-09
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多