21.3.4 改变大小
当堆被分配后,有时会有内存不够用的情况,因此就需要一种自动分配的机制。realloc()函数可以实现内存的动态缩放。该函数的原型如下:
- void *realloc(void *mem_address, unsigned int newsize);
该函数设置mem_address所指内存块的大小为newsize长度。如果重新分配成功,则返回指向被分配内存的指针;否则返回空指针为NULL。同malloc()和new一样,当不再使用时,也应该使用free()和delete将内存块释放。
与malloc()和new不同的是,该函数是在原有内存基础上修改了内存块的范围,既可以对原有内存进行扩大也可以进行缩小。但无论怎么修改,原有内存的内容不会改变。
当新申请的内存块大于原有内存时,系统一般会作如下两种处理方式:
如果有足够空间用于扩大mem_address指向的内存块,则在原有内存后追加额外内存,并返回mem_address,这样得到的是一块连续的内存。
如果原来的内存块后面没有足够的空闲空间用来分配,那么从堆中另外找一块newsize大小的内存。并把原来内存空间中的内容复制到新空间中。这样返回的内存地址已经不再是原来内存块的地址,因为数据被移动了。
当新申请的内存块小于原有内存时,系统就会直接在原有内存上分配。
【示例21-11】 二次内存分配的方法。
- #include<iostream>
- #include <malloc.h> //内存管理的库函数
- int main(int argc, char *argv[])
- {
- int *p;
- p = (int *)malloc(sizeof(int) *4);
- for(int i=0;i<4++i)
- {
- p[i] = i + 1;
- }
- for(i=0;i<3;i++)
- {
- std::cout << p[i] << "\t";
- }
- std::cout << "\n";
- p = (int *) realloc(p, sizeof(int) *8);
- for(int i=4;i<8;++i)
- {
- p[i] = i + 1;
- }
- for(i=0;i<8;i++)
- {
- std::cout << p[i] << "\t";
- }
- std::cout << "\n"; free(p);
- return 0;
- }
分析:该示例首先用malloc()函数分配了4个int单位的内存空间,然后又用realloc()将空间扩大为8个。由于realloc()重新分配空间时,不会破坏原有空间的内容,因此该示例的输出如下:
- 1 2 3 4
- 1 2 3 4 5 6 7 8
【责任编辑:
云霞 TEL:(010)68476606】