【问题标题】:Double free or corruption at end of program with no free's在没有免费的程序结束时双重免费或损坏
【发布时间】:2013-03-07 14:24:19
【问题描述】:

我的程序正在完成,甚至在返回 0 之前打印出最终的“DONE2”;主要。 我使用 malloc 进行动态内存分配,但我的程序中没有空闲内存。

为什么/如何在没有免费的情况下获得这个,为什么我的程序仍在运行直到完成,我应该如何找到错误的来源?

编辑:我只是想问如果没有 free 怎么可能得到错误以及程序如何到达执行结束。

*** glibc detected *** ./prog: double free or corruption (out): 0x09574040 ***
======= Backtrace: =========
/lib/libc.so.6[0x9ca595]
/lib/libc.so.6(cfree+0x59)[0x9ca9d9]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0x2e6c581]
./prog[0x804b2f9]
./prog[0x804b33b]
./prog[0x804b34f]
./prog[0x804b4d5]
./prog[0x804b4ec]
./prog[0x804bb6f]
./prog[0x8049d43]
./prog[0x8049d59]
./prog[0x8049d88]
./prog[0x8049da2]
./prog[0x8049de3]
./prog[0x8049e6f]
./prog[0x8049604]
/lib/libc.so.6(__libc_start_main+0xdc)[0x976e9c]
./prog(__gxx_personality_v0+0x79)[0x8049271]
======= Memory map: ========
002d4000-002d5000 r-xp 002d4000 00:00 0          [vdso]
0093e000-00958000 r-xp 00000000 fd:00 559505     /lib/ld-2.5.so
00958000-00959000 r-xp 00019000 fd:00 559505     /lib/ld-2.5.so
00959000-0095a000 rwxp 0001a000 fd:00 559505     /lib/ld-2.5.so
00961000-00aa0000 r-xp 00000000 fd:00 559506     /lib/libc-2.5.so
00aa0000-00aa2000 r-xp 0013f000 fd:00 559506     /lib/libc-2.5.so
00aa2000-00aa3000 rwxp 00141000 fd:00 559506     /lib/libc-2.5.so
00aa3000-00aa6000 rwxp 00aa3000 00:00 0 
00aa8000-00acd000 r-xp 00000000 fd:00 559513     /lib/libm-2.5.so
00acd000-00ace000 r-xp 00024000 fd:00 559513     /lib/libm-2.5.so
00ace000-00acf000 rwxp 00025000 fd:00 559513     /lib/libm-2.5.so
02dab000-02db6000 r-xp 00000000 fd:00 559517     /lib/libgcc_s-4.1.2-20080825.so.1
02db6000-02db7000 rwxp 0000a000 fd:00 559517     /lib/libgcc_s-4.1.2-20080825.so.1
02db9000-02e99000 r-xp 00000000 fd:00 79091      /usr/lib/libstdc++.so.6.0.8
02e99000-02e9d000 r-xp 000df000 fd:00 79091      /usr/lib/libstdc++.so.6.0.8
02e9d000-02e9e000 rwxp 000e3000 fd:00 79091      /usr/lib/libstdc++.so.6.0.8
02e9e000-02ea4000 rwxp 02e9e000 00:00 0 
08048000-0805c000 r-xp 00000000 fd:00 789714     /home/echelon/correngine/prog
0805c000-0805d000 rw-p 00013000 fd:00 789714     /home/echelon/correngine/prog
09553000-09594000 rw-p 09553000 00:00 0          [heap]
b7fa9000-b7fab000 rw-p b7fa9000 00:00 0 
b7fb4000-b7fb5000 rw-p b7fb4000 00:00 0 
bfbe9000-bfbfe000 rw-p bffea000 00:00 0          [stack]
DONE
DONE2
make: *** [run] Aborted

编辑:谢谢,问题是我远远超出了缓冲区,导致“损坏”而不是双重释放。

【问题讨论】:

    标签: c++ debugging free glibc


    【解决方案1】:

    我使用 malloc 进行动态内存分配,但我的程序中没有空闲内存

    哇!停在这里!这是一个严重的问题——你的程序中的一个错误。当您遇到这个明显的错误时,弄清楚为什么 other 事情不能正常工作并不是很重要。您需要首先通过为malloc 的每个调用添加对free 的匹配调用来解决此问题。只有在您完成此操作后,您才应该担心解决您的其他问题(如果它们仍然存在的话)!

    为什么/如何在没有免费的情况下获得这个

    几乎可以肯定,这是在报告与free 的使用(或未使用)无关的问题。错误消息的重要部分实际上是 corruption 部分。

    当您覆盖超过使用malloc 请求的内存块时,通常会出现此错误。例如,如果您打算分配一块内存来保存结构 Foo,但您只为 pointer 分配了指向结构 Foo 的空间,那么您将继续写入超出数量实际分配的空间,破坏内存中不属于您的信息。 glibc 正在检测内存中可能是它自己的数据的这种损坏并抛出一个合适的结果。

    除非我们能看到实际的代码,否则我们不可能找出发生这种情况的地方。但是,当您检查代码以搜索对malloc 的所有调用以将它们与对free 的相应调用相匹配时,这也是检查并确保您对@987654331 的每个调用的好时机@ 是正确的。

    为什么我的程序一直运行到完成

    如果问题和我上面预测的一样,那么你已经进入了Undefined Behavior 的领域。基本上,这意味着你做了一些语言标准规定你不应该做的事情(重写不属于你的内存)。既然你已经这样做了,语言标准绝对不能保证你的程序执行时会发生什么。它可能工作得很好。它可能每次都会崩溃。它可能只是偶尔崩溃。它可能会损坏您的硬盘。它可能导致你的房子着火并demons to fly out of your nose。你永远不知道。这就是为什么您应该不惜一切代价避免调用未定义行为。它不仅可怕,而且还指出了您的代码中的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      • 2015-04-03
      相关资源
      最近更新 更多