zoukankan      html  css  js  c++  java
  • 那些年满天飞的bug(1)

    环境:Ubuntu+Linux+gcc

    错误:*** glibc detected *** ./server3: free(): invalid pointer: 0x00007f0994a99010 ***

    错误原因分析:将malloc()分配的指针被修改以后传给了free()

    网络相关资源:点击打开链接 点击打开链接

    引用:《C和指针》中关于这个错误有较为详细的叙述,摘取如下:

            警告:

                    当你使用free时,可能会出现各种不同的错误。传递给free的指针必须是一个从malloc、calloc或realloc函数返回的指针。传递给free函数一个指针,让它释放一块并非动态分配的内存可能导致程序立即中止或在晚些时候终止。试图释放一块动态内存的一部分也有可能引起类似的问题,像下面这样:

             

    /*
    **Get 10 integers
    */
         pi=malloc(10*sizeof(int));
         ....
    /*
    **Free only the last 5 integers;keep th**e first 5
    */
        free(pi+5);


    总结:使用动态内存分配时,稍有不慎出现的问题非常多。而且有些问题甚至是编译器不会出现错误、警告的。所以要严格的遵照规则来办事,不要去涉及那些“阴暗”的角落,不是你的内存你别用。使用malloc、free的正确的模式应该如下:

    /*pi是一个指针*/
        pi=malloc(10*sizeof(int));
        if(NULL==pi)/*尽管分配内存失败这种情况非常少见,但还是要预防*/
        {
                printf("内存申请失败!
    ");
                exit(1);
        }
         ......
        /*使用完后记得释放,不然会造成内存泄露,这样子会将一点点的榨干可用内存。*/
        free(pi);/*记得不要试图释放并非内存分配的内存或者释放一块动态分配的内存的一部分*/
        pi=NULL;/*防止动态内存指针被释放后继续被使用*/


     

                     

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    音乐播放器
    滚动视图、定时器、分页控件的综合使用
    简易拼图
    IOS开发复习笔记(1)-OC基础知识
    64位matlab mex64位编译器解决方案
    LibSvm添加到Matlab
    code first 数据库无损迁移
    asp.net mvc4连接mysql
    自定义控件引用时候尺寸发生变化
    jquery 操作动态添加的元素
  • 原文地址:https://www.cnblogs.com/TGSB/p/4824247.html
Copyright © 2011-2022 走看看