zoukankan      html  css  js  c++  java
  • C 语言 *** glibc detected *** free(): invalid next size (fast): 0x0000000000be1010 ***

    .

    .

    .

    .

    .

    LZ 今天在写一个 Socket 程序的时候使用 malloc(3) 在堆上动态分配了一个结构体的空间,在使用完之后用 free(3) 函数释放空间的时候报 invalid next size 这样的一个错误,经过了两个小时的调试,最后发现是因为粗心越界导致的。

    LZ 把这个错误缩减为一个最简单的模型发布出来:

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     4 
     5 int main (void)
     6 {
     7         char *p = NULL;
     8 
     9         // 在堆空间申请 8 字节的内存
    10         p = malloc(8);
    11 
    12         // 实际使用超过 8 字节
    13         strncpy(p, "abcd", 128);
    14         // 可以正常打印
    15         printf("p = %s
    ", p);
    16 
    17         // 释放内存时会报 invalid next size 错误
    18         free(p);
    19 
    20         return 0;
    21 }

    编译运行:

    >$ gcc -Wall free.c -o free
    >$ ./free
    p = abcdefghijklmn
    *** glibc detected *** ./free: free(): invalid next size (fast): 0x00000000020c3010 ***
    ...此处生略 n 行...

    打印是不受影响的,但其实在 strncpy(3) 的时候就已经越界了,所以发生什么情况都是正常的。

    另外对于上面这个栗子,使用 strcpy(3) 替代 strncpy(2) 就不会报错了,但是一旦要拷贝的字符超过了 8 个字节,依然可能引发错误。

    所以大家在使用内存的时候一定要注意长度,千万不可越界。

  • 相关阅读:
    怎么快速掌握一门新技术
    Linq相关
    C# 参数按照ASCII码从小到大排序(字典序)
    测试工具
    sql 创建临时表
    sql行合并
    WCF相关
    免费开源分布式系统日志收集框架 Exceptionless
    VPS,虚拟主机,云主机,独立服务器区别
    c# Dictionary的遍历和排序
  • 原文地址:https://www.cnblogs.com/0xcafebabe/p/4480117.html
Copyright © 2011-2022 走看看