zoukankan      html  css  js  c++  java
  • 真正认识realloc

    har* p = malloc(1024);
    char* q = realloc(p,2048);

    现在的问题是我们应该如何处理指针 p。 刚开始按照我最直观的理解,如果就是直接将 p = NULL;。 到最后只需要释放 q的空间就可以了。

    因为最近在做个封装。结果在做单元测试的时候发现。有时候我在 free(q); 的时候会出错。这样我就郁闷了。

    后来仔细一跟踪,发现 realloc 完以后 q 和 p 的指针地址是一样。不过有时候又不一样。

    仔细查了下资料。得到如下信息:

           1.如果 当前连续内存块足够 realloc 的话,只是将p所指向的空间扩大,并返回p的指针地址。 这个时候 q 和 p 指向的地址是一样的。

           2.如果 当前连续内存块不够长度,再找一个足够长的地方,分配一块新的内存,q,并将 p指向的内容 copy到 q,返回 q。并将p所指向的内存空间删除。

    这样也就是说 realloc 有时候会产生一个新的内存地址 有的时候不会。所以在分配完成后。我们需要判断下 p 是否等于 q。并做相应的处理。

    这里有点要注意的是要避免 p = realloc(p,2048); 这种写法。有可能会造成 realloc 分配失败后,p原先所指向的内存地址丢失。

    =========================================

    关于realloc函数说明的补充:
    函数定义:
    void *realloc(void *ptr, size_t size);
    上面的分析基本没有问题,但有两点要注意:
    1.返回值可能与ptr的值不同,如果是不同的话,那么realloc函数完成后,ptr指向的旧内存已被free掉了。
    2。如果返回NULL值,则分配不成功,而原来的ptr指向的内存还没有被free掉,要求程序显式free.

    故p = (int *) realloc (p, sizeof(int) *15);语句有这么一个问题,
    调用前p指向一个已分配成功的内存,而调用realloc时却失败(即返回NULL),此时,p原来指向的内存还没有free掉,而现在又找不到地址,这样就出现memory leak了。

    当realloc分配失败返回NULL时,原指针指向的内容不变,这样pn=(int *)realloc(pn,10*sizeof(int))确实不妥,会使pn的原值丢失,从而使pn在realloc之前指向的内存发生泄漏。用LZ的q = pn备份原指针之后再检查pn在realloc后是否为NULL可以解决问题,也可以这样:
    int *q = realloc(pn,10*sizeof(int));
    if(q != NULL)
    pn = q;

     

  • 相关阅读:
    js + html 实现视频截图
    检测浏览器版本是否支持webp
    【安装系统】win8装win7遇到的一些坑
    《说文解字》与程序设计
    朝花夕拾——更新两个开源项目
    js发送和接收二进制字节流数据
    字符编码--丛起原到代码
    JavaScript进行WebSocket字节流通讯示例
    JavaScript进行UTF-8编码与解码
    JS字符串与二进制的相互转化
  • 原文地址:https://www.cnblogs.com/droidxin/p/3617854.html
Copyright © 2011-2022 走看看