C++内存操作

来源:互联网 发布:golang 1.8 新特性 编辑:程序博客网 时间:2024/06/05 02:09

C中内存分配与释放函数如下所示:
1 malloc函数
extern void* malloc(unsigned int num_bytes)
函数的功能是分配长度是num_bytes字节的内存块,如果分配成功则返回指向

分配内存的指针,如果分配失败返回空指针
注意
如果不再使用的内存可以使用free函数释放掉
C,C++规定,void*类型可以强制转换为任何其它类型的指针
void*表示未确定类型的指针,更明确的说是指申请内存空间时还不知道用户是

用这段空间来存储什么类型的数据。
malloc只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内

存中,其值将是随机的。
typedef struct data_type{
 int age;
 charname[20];
}data;
data* bob;
bob=(data*)malloc(sizeof(data));
if(bob!=NULL){
 bob->age=22;
 strcpy(bob->name,"Robert");
 printf("%sis%dyearsold\n",bob->name,bob->age);
}else{
 printf("mallocerror!\n");
 exit(1);
}
free(bob);
内存泄漏实例:
#include<stdio.h>
#include<malloc.h>
#define MAX 100000000
int main(void){
 int* a[MAX];
 inti;
 for(i=0;i<MAX;i++){
  a[i]=(int*)malloc(MAX);
 }
 return0;
}

2 calloc函数
void* calloc(unsigned n,unsigned size)
函数功能:在内存的动态存储区中分配n个长度为size的连续空间,函数返回

一个指向分配起始地址的指针,如果分配不成功,返回NULL。
跟malloc的区别:calloc在动态分配完内存后,自动初始化分配空间为零,

而malloc不初始化,里面的数据是随机的垃圾数据。
例子:
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
int main(void){
 char*str=NULL;
 /*分配内存空间*/
 str=(char*)calloc(10,sizeof(char));
 /*将hello写入*/
 strcpy(str,"Hello");
 /*显示变量内容*/
 printf("Stringis%s\n",str);
 /*释放空间*/
 free(str);
 return0;
}

#include<stdio.h>
#include<stdlib.h>
int main(void){
 int i;
 int* pn=(int*)calloc(10,sizeof(int));
 for(i=0;i<10;i++)
  printf("%3d",*pn++);
 printf("\n");
 free(pn);
 return0;
 }
输出十个0

3 realloc函数
extern void* realloc(void* mem_address,unsigned int newsize)
函数功能:先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到

新分配的内存区域,而后释放原来的mem_address所指内存区域,同时返回新

分配的内存区域的首地址
如果重新分配成功则返回指向被分配的内存指针,否则返回空指针NULL
#include<stdio.h>
#include<stdlib.h>
int main(){
 int i;
 int* pn=(int*)malloc(5*sizeof(int));
 printf("%p\n",pn);
 for(i=0;i<5;i++)
 scanf("%d",&pn[i]);
 pn=(int*)realloc(pn,10*sizeof(int));
 printf("%p\n",pn);
 for(i=0;i<5;i++)
 printf("%3d",pn[i]);
 printf("\n");
 free(pn);
 return0;
}

#include<syslib.h>
#include<alloc.h>
int main(){
 char*p;
 clrscr();
 p=(char*)malloc(100);
 if(p)
  printf("MemoryAllocatedat:%x",p);
 else
  printf("NotEnoughMemory!\n");
 getchar();
 p=(char*)realloc(p,256);
 if(p)
  printf("MemoryReallocatedat:%x",p);
 else
  printf("NotEnoughMemory!\n");
 free(p);
 getchar();
 return0;
}

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。

 

原创粉丝点击