设为首页 加入收藏

TOP

21.3.4 改变大小
2013-10-07 01:15:16 来源: 作者: 【 】 浏览:78
Tags:21.3.4 改变 大小

21.3.4  改变大小

当堆被分配后,有时会有内存不够用的情况,因此就需要一种自动分配的机制。realloc()函数可以实现内存的动态缩放。该函数的原型如下:

  1. 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】 二次内存分配的方法。

  1. #include<iostream>  
  2. #include <malloc.h>                         //内存管理的库函数  
  3. int main(int argc, char *argv[])  
  4. {   
  5.     int  *p;  
  6.     p = (int *)malloc(sizeof(int) *4);      //在堆上分配内存单元  
  7.     for(int i=0;i<4++i)     
  8.     {     
  9.         p[i] = i + 1;                       //初始化  
  10.     }  
  11.     for(i=0;i<3;i++)   
  12.     {  
  13.         std::cout << p[i] << "\t";     
  14.     }  
  15.     std::cout << "\n";  
  16.     p = (int *) realloc(p, sizeof(int) *8); //修改内存的大小  
  17.     for(int i=4;i<8;++i)     
  18.     {     
  19.         p[i] = i + 1;                       //初始化  
  20.     }  
  21.     for(i=0;i<8;i++)   
  22.     {  
  23.         std::cout << p[i] << "\t";     
  24.     }  
  25.     std::cout << "\n";  free(p);  
  26.     return 0;  
  27. }  

分析:该示例首先用malloc()函数分配了4个int单位的内存空间,然后又用realloc()将空间扩大为8个。由于realloc()重新分配空间时,不会破坏原有空间的内容,因此该示例的输出如下:

  1. 1 2 3 4  
  2. 1 2 3 4 5 6 7 8 

【责任编辑:云霞 TEL:(010)68476606】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇21.1 内存的分类 下一篇21.2.4 改变大小

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: