realloc 用过很多次了。无非就是将已经存在的一块内存扩大。
char* 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原先所指向的内存地址丢失。
以下来自百度:
1. realloc失败的时候,返回NULL
2. realloc失败的时候,原来的内存不改变,不会释放也不会移动
3. 假如原来的内存后面还有足够多剩余内存的话,realloc的内存=原来的内存+剩余内存,realloc还是返回原来内存的地址; 假如原来的内存后面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free掉,realloc返回新内存的地址
4. 如果size为0,效果等同于free()。这里需要注意的是只对指针本身进行释放,例如对二维指针**a,对a调用realloc时只会释放一维,使用时谨防内存泄露。
5. 传递给realloc的指针必须是先前通过malloc(), calloc(), 或realloc()分配的
6.传递给realloc的指针可以为空,等同于malloc。
发表评论
-
set容器的反向迭代器
2013-05-02 16:56 3673#include <iostream> #in ... -
对于CRITICAL_SECTION用法的介绍和理解[转]
2013-04-08 11:50 2088很多人对CRITICAL_SECTION ... -
二维数组知识
2012-09-15 17:20 767二维数组和指针⑴ 用 ... -
extern C的由来
2012-08-09 10:14 662时常在cpp的代码之中看到这样的代码: #ifdef ... -
C++类对象的创建过程
2012-07-26 16:02 890分配空间(Allocation) ... -
静态数据成员和静态成员函数
2012-07-26 15:04 3050静态类成员包括静态数据成员和静态函数成员两部分。 与 ... -
复制构造函数(拷贝构造函数)以及深浅拷贝
2012-07-25 22:39 1385对于普通对象而言复制是很简单的,一般是将变量或者常量赋值给某 ... -
cin、cin.get、cin.getline()、getline()、gets()的用法【转】
2012-07-24 20:05 777学C++的时候,这几个输入函数弄的有点迷糊;这里做个小结,为了 ... -
编程笔记(07-24)
2012-07-24 15:15 6231 #include < stdio.h ... -
堆、栈解疑
2012-07-12 21:53 533一、预备知识—程序的内存分配 一个由C/C++编译的程序 ... -
指针和内存分配的深度理解
2012-07-12 18:57 980一 :关于指针和堆的内存分配 先来介绍一下指针: 指针一种 ... -
数组指针和指针数组
2012-07-12 18:56 1130先看一下基本的形式,我们从这里起步! ----------- ... -
const指针和指向const的指针
2012-07-12 10:30 2068指向const对象的指针 ... -
typedef的学习
2012-07-11 15:03 664typedef,顾名思义,为“类型定义”,可以解释为:将一种数 ... -
函数指针和指针函数
2012-07-11 11:21 531【函数指针】 ... -
Define学习
2012-07-11 10:12 1004宏替换是C/C++系列语言的技术特色,C/C++语言提 ... -
sizeof 深研
2012-07-11 09:39 6331、什么是sizeof 首先看一下sizeof ... -
内存对齐问题
2012-07-10 22:35 10421.内存数据对齐的原因: 无论如何,为了提高程序的性 ... -
指针深究
2012-07-09 21:55 538在说指向指针的指针之前,不得不说指向变量的指针。先看如下示例: ... -
C语言文件使用方式详解
2012-07-04 10:23 709文件的打开(fopen函数) f ...
相关推荐
realloc函数的使用在数据结构中十分重要,本文给出了使用的例子和使用的具体说明
数据结构顺序表 C语言代码实现以及realloc的使用
realloc原型是extern void *realloc(void *mem... #include <stdlib> 有些编译器需要#include ,在TC2.0中可以使用alloc.h头文件 功能 先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地
C中堆管理—浅谈malloc,calloc,realloc 函数之间的区别 详情:http://blog.csdn.net/fjb2080
linux软件工程师(c语言),指针的指针,Linux_C函数速查.chm,makefile写法与应用,malloc,calloc和realloc使用小结,结构体指针的指针使用
实现内存管理函数,包括malloc、free、realloc等函数的实现
就是配套我一篇博客讲解的资源,因为我截图可能不是特别清楚,所以我就将这个图上传上来了。是采用Visio画的。
个人总结各类博客和资料里关于malloc,calloc,realloc的对比
realloc_test
C语言函数realloc.doc
以下是对c语言中的malloc函数,realloc函数与calloc函数的区别以及它们之间的联系进行了介绍,需要的朋友可以过来参考下
我使用系统mmap实现的libc malloc,realloc和free函数 特征 大小分段:将请求分为SMALL,MEDIUM和LARGE,对SMALL和MEDIUM请求使用预分配的区域 释放碎片空间以优化重用 Hexdump分配的内存功能 实现的功能: malloc-...
Malloc 返回一块内存地址的指针,否则会返回空指针null,这里要注意的是,当内存不再使用的时候,用free()函数进行对内存的释放。 2.calloc 作 用:calloc()函数有两个参数,分别为元素的数目和每个元素...
使用动态内存很明显的好处是:不需要预先分配存储空间且分配的空间可以根据程序的需要扩大或缩小,这样可以有效的使用内存空间。 malloc和free C函数库中的malloc和free分别用于执行动态内存分配和释放。这...
采用FOR90语言编制的实现类似Delphi中Setlength的动态数组扩展功能。原有的FORTRAN90的动态数组在扩展时首先需要释放掉原有空间,即原有数据不能得以保存,而SetLength(A,N)则将A的长度动态设定为N,而保持原有数据...
c代码-c语言realloc函数