程序结束时双重释放或损坏,没有免费
Double free or corruption at end of program with no free's
我的程序正在完成,甚至在返回0之前打印最终的"DONE2";在主。我有动态内存分配与malloc,但我没有自由的在我的程序。
为什么/我怎么能得到这个没有自由,为什么我的程序仍然运行直到完成,我应该如何找到错误的来源/s ?
编辑:我只是想问如果没有free's如何可能得到错误,以及程序如何到达执行结束。
*** 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
编辑:谢谢,问题是我长时间地超出了缓冲区,导致了"腐败",而不是双重自由。
我使用malloc进行动态内存分配,但是我的程序中没有free
哇!停在这里!这是一个严重的问题——程序中的错误。当你有这个明显的bug时,弄清楚为什么其他不能正常工作并不重要。您需要解决这个问题首先通过为您必须对malloc
的每个调用添加对free
的匹配调用。只有当你这样做了,你才应该担心解决你的其他问题(如果它们仍然存在)!
为什么/我怎么能得到这个没有免费的
几乎可以肯定,这是报告一个与使用(或不使用)free
无关的问题。错误消息的重要部分实际上是损坏部分。
当您使用malloc
覆盖过去的内存块时,通常会出现此错误。例如,如果您打算分配一块内存来保存结构体Foo
,但是您只为指向结构体Foo
的指针分配了空间,那么您将继续写入超出实际分配的空间量的内容,从而破坏内存中不属于您的信息。Glibc正在检测内存中可能是它自己的数据的损坏,并抛出一个错误。
除非我们能看到实际的代码,否则我们不可能发现这是在哪里发生的。但是,当您在代码中搜索所有对malloc
的调用,以便将它们与相应的free
调用相匹配时,这也是检查并确保对malloc
的每个调用都是正确的好时机。
为什么我的程序还在运行直到完成
如果问题是我上面预测的,你已经进入了未定义行为的领域。基本上,这意味着您做了语言标准规定不应该做的事情(在不属于您的内存上写入内容)。由于您已经这样做了,因此语言标准绝对不能保证程序执行时可能发生的情况。它可能工作得很好。它可能每次都崩溃。它可能只是有时会崩溃。它可能损坏您的硬盘。它可能会导致你的房子着火,恶魔从你的鼻子里飞出来。你永远不会知道。这就是为什么你应该不惜一切代价避免调用未定义行为。它不仅可怕,还指出了代码中的错误。
- 为什么会发生堆损坏
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 平均图像时图像损坏
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 为什么C中的通用链表中存储的数据已损坏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- C++双重释放或损坏(out)
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- 使用全局声明的向量时,C++双重释放错误/损坏
- 使用线程和静音时,双免费或损坏(!prev)错误
- IPIV magma_getrs_gpu上的双免费或损坏(OUT)
- 尝试在unordered_map中删除时双免费或损坏
- 范围末尾的C 双免费或损坏错误
- C 双免费或损坏错误
- C++:双倍免费或损坏(out)
- 检测到glibc:双重免费或损坏
- MxCalloc和MxFree与OpenMP结果双重免费或损坏
- 程序结束时双重释放或损坏,没有免费
- 在执行并行版本时,双重免费或损坏(fasttop)
- 在读取/写入文件时双重免费或损坏