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;/*防止动态内存指针被释放后继续被使用*/


     

                     

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

  • 相关阅读:
    kettle的转换组件
    kettle的输出组件
    js的touch事件的实际引用
    touchstart,touchmove,touchend触摸事件的小小实践心得
    Android使用ViewPager实现左右循环滑动及轮播效果
    jQuery漂亮图标的垂直导航菜单
    c#使用WebClient登录网站抓取登录后的网页
    从网页抓取数据的一般方法
    c#通过oledb获取excel文件表结构信息
    c#中高效的excel导入sqlserver的方法
  • 原文地址:https://www.cnblogs.com/TGSB/p/4824247.html
Copyright © 2011-2022 走看看