首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >双重释放或损坏的原因

双重释放或损坏的原因
EN

Stack Overflow用户
提问于 2014-05-09 21:39:30
回答 2查看 9.2K关注 0票数 4
代码语言:javascript
复制
#include<stdio.h>
#include<stdlib.h>

    main() {
        int *ptr, *tmp;
        ptr = (int *)malloc(sizeof(int) * 60);
        tmp = ptr;
        printf("tmp  %u ptr %u\n", tmp, ptr);
        int i =0;
        for (i = 0; i < 76; i ++)
        {
            *ptr = i;
            ptr++;
        }

    printf("tmp  %u ptr %u\n", tmp, ptr);
    free (tmp);
    }

this program crahes when we run it 





{124}: ./a.out 
tmp  23134224 ptr 23134224
tmp  23134224 ptr 23134528
*** glibc detected *** ./a.out: double free or corruption (!prev): 0x0000000001610010 ***
======= Backtrace: =========
/lib64/libc.so.6[0x333ce750c6]
./a.out[0x4005e0]
/lib64/libc.so.6(__libc_start_main+0xfd)[0x333ce1ecdd]
./a.out[0x400499]
======= Memory map: ========
00400000-00401000 r-xp 00000000 00:2b 26388454                           /users/home40/rnadakud/cpract/a.out
00600000-00601000 rw-p 00000000 00:2b 26388454                           /users/home40/rnadakud/cpract/a.out
01610000-01631000 rw-p 00000000 00:00 0                                  [heap]
333c600000-333c620000 r-xp 00000000 fd:00 1253867                        /lib64/ld-2.12.so
333c81f000-333c820000 r--p 0001f000 fd:00 1253867                        /lib64/ld-2.12.so
333c820000-333c821000 rw-p 00020000 fd:00 1253867                        /lib64/ld-2.12.so
333c821000-333c822000 rw-p 00000000 00:00 0 
333ce00000-333cf97000 r-xp 00000000 fd:00 1253879                        /lib64/libc-2.12.so
333cf97000-333d197000 ---p 00197000 fd:00 1253879                        /lib64/libc-2.12.so
333d197000-333d19b000 r--p 00197000 fd:00 1253879                        /lib64/libc-2.12.so
333d19b000-333d19c000 rw-p 0019b000 fd:00 1253879                        /lib64/libc-2.12.so
333d19c000-333d1a1000 rw-p 00000000 00:00 0 
333ee00000-333ee16000 r-xp 00000000 fd:00 1253886                        /lib64/libgcc_s-4.4.6-20110824.so.1
333ee16000-333f015000 ---p 00016000 fd:00 1253886                        /lib64/libgcc_s-4.4.6-20110824.so.1
333f015000-333f016000 rw-p 00015000 fd:00 1253886                        /lib64/libgcc_s-4.4.6-20110824.so.1
7f085a471000-7f085a474000 rw-p 00000000 00:00 0 
7f085a492000-7f085a495000 rw-p 00000000 00:00 0 
7ffffddb2000-7ffffddc7000 rw-p 00000000 00:00 0                          [stack]
7ffffddff000-7ffffde00000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Abort (core dumped)

我知道我覆盖了数组,但是这里观察到崩溃发生在当我释放(Tmp)的时候,尽管我正在写ptr,但是当我释放(Ptr)时应该只释放前60个字节

所以请帮助我理解这个错误。

EN

回答 2

Stack Overflow用户

发布于 2014-05-09 21:41:35

覆盖会调用未定义的行为。

在您的例子中,您丢弃了堆的数据结构,导致free()做了一些崩溃的事情。这就是为什么它被称为“未定义的行为”,因为你不知道什么时候,如何,或者是否会有任何可观察到的“证据”表明你做错了什么。或者,当程序做一些看似不相关的事情时,它也可以出现。

还有,please don't cast the return value of malloc() in C

票数 8
EN

Stack Overflow用户

发布于 2014-05-09 21:48:01

您的写入超出了您分配的内存块的末尾,并且行为未定义。

我知道我覆盖了数组,但是这里观察到崩溃发生在当我释放(Tmp)的时候,即使我正在写ptr,但是当我释放(Ptr)的时候,它应该只释放前60个字节。

堆分配的内存通常通过将关于内存块的元数据与内存块一起存储来工作。这是必需的,以便堆管理器知道如何释放内存块。毕竟,当您将指针传递给free时,堆管理器确实需要一些方法来解决如何释放内存的问题。

这里发生的情况是,您正在损坏元数据,并且在调用free时会检测到这一点。它看起来很像是在使用调试堆管理器,它在运行时实现调试代码来检测此类堆损坏。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23566114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档