加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用字符串调用free()会检测到*** glibc ***错误

发布时间:2020-12-16 10:50:32 所属栏目:百科 来源:网络整理
导读:参见英文答案 Facing an error “*** glibc detected *** free(): invalid next size (fast)”????????????????????????????????????2个 代码: #include stdio.h#include stdlib.hint main(){ char * cp = malloc(sizeof * cp * 20); cp="Hello"; free(cp
参见英文答案 > Facing an error “*** glibc detected *** free(): invalid next size (fast)”????????????????????????????????????2个
代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
   char * cp = malloc(sizeof * cp * 20);
   cp="Hello";
   free(cp);

    return 0;
}

错误:

我认为指针在释放它之前会以某种方式被破坏,但我不知道如何.无所事事,并在mallocing后立即释放它工作正常,所以我认为我把字符串值放错了.

很抱歉这是一个新手.任何帮助是极大的赞赏.

哦,我不知道为什么标准C库被包含在那个错误中,但那不是问题.我尝试手动编译它是gcc并得到相同的错误,减去libstdc. Code :: Blocks是愚蠢的.

*** glibc detected *** ./mallocTest: free(): invalid pointer: 0x000000000040069c *** ======= Backtrace: ========= /lib/libc.so.6(+0x71496)[0x7f92ee448496] /lib/libc.so.6(cfree+0x6c)[0x7f92ee44d29c] ./mallocTest[0x40059e] /lib/libc.so.6(__libc_start_main+0xfd)[0x7f92ee3f5c3d] ./mallocTest[0x4004b9] ======= Memory map: ======== 00400000-00401000 r-xp 00000000 08:08 3162120 /home/gabriel/Programming/C/mallocTest 0
#include <stdio.h>
#include <stdlib.h>

int main()
{
   char * cp = malloc(sizeof * cp * 20);
   cp="Hello";
   free(cp);

    return 0;
}
#include <stdio.h> #include <stdlib.h> int main() { char * cp = malloc(sizeof * cp * 20); cp="Hello"; free(cp); return 0; }00-00601000 rw-p 00000000 08:08 3162120 /home/gabriel/Programming/C/mallocTest
01327000-01348000 rw-p 00000000 00:00 0 [heap]
7f92e8000000-7f92e8021000 rw-p 00000000 00:00 0
7f92e8021000-7f92ec000000 ---p 00000000 00:00 0
7f92ee3d7000-7f92ee52a000 r-xp 00000000 08:08 2452227 /lib/libc-2.12.2.so
7f92ee52a000-7f92ee729000 ---p 00153000 08:08 2452227 /lib/libc-2.12.2.so
7f92ee729000-7f92ee72d000 r--p 00152000 08:08 2452227 /lib/libc-2.12.2.so
7f92ee72d000-7f92ee72e000 rw-p 00156000 08:08 2452227 /lib/libc-2.12.2.so
7f92ee72e000-7f92ee733000 rw-p 00000000 00:00 0
7f92ee733000-7f92ee748000 r-xp 00000000 08:08 33223 /usr/lib/libgcc_s.so.1
7f92ee748000-7f92ee948000 ---p 00015000 08:08 33223 /usr/lib/libgcc_s.so.1
7f92ee948000-7f92ee949000 rw-p 00015000 08:08 33223 /usr/lib/libgcc_s.so.1
7f92ee949000-7f92ee9ca000 r-xp 00000000 08:08 2449430 /lib/libm-2.12.2.so
7f92ee9ca000-7f92eebc9000 ---p 00081000 08:08 2449430 /lib/libm-2.12.2.so
7f92eebc9000-7f92eebca000 r--p 00080000 08:08 2449430 /lib/libm-2.12.2.so
7f92eebca000-7f92eebcb000 rw-p 00081000 08:08 2449430 /lib/libm-2.12.2.so
7f92eebcb000-7f92eecb7000 r-xp 00000000 08:08 33213 /usr/lib/libstdc++.so.6.0.14
7f92eecb7000-7f92eeeb6000 ---p 000ec000 08:08 33213 /usr/lib/libstdc++.so.6.0.14
7f92eeeb6000-7f92eeebe000 r--p 000eb000 08:08 33213 /usr/lib/libstdc++.so.6.0.14
7f92eeebe000-7f92eeec0000 rw-p 000f3000 08:08 33213 /usr/lib/libstdc++.so.6.0.14
7f92eeec0000-7f92eeed5000 rw-p 00000000 00:00 0
7f92eeed5000-7f92eeef3000 r-xp 00000000 08:08 2449712 /lib/ld-2.12.2.so
7f92ef0be000-7f92ef0c3000 rw-p 00000000 00:00 0
7f92ef0f1000-7f92ef0f2000 rw-p 00000000 00:00 0
7f92ef0f2000-7f92ef0f3000 r--p 0001d000 08:08 2449712 /lib/ld-2.12.2.so
7f92ef0f3000-7f92ef0f4000 rw-p 0001e000 08:08 2449712 /lib/ld-2.12.2.so
7f92ef0f4000-7f92ef0f5000 rw-p 00000000 00:00 0
7fff6b352000-7fff6b373000 rw-p 00000000 00:00 0 [stack]
7fff6b3ff000-7fff6b400000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Aborted

解决方法

char * cp = malloc(sizeof * cp * 20);

这里cp被声明为char *并初始化为指向动态分配的20 char数组.

cp="Hello";

现在你指定cp指向一个固定的字符串,丢失以前的cp值.这是导致内存泄漏的地方.

free(cp);

这现在试图释放固定字符串,但这是非法的.您只能释放malloc(或calloc或realloc)分配的内存.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读