C++内存操作
2013-08-19 17:48
169 查看
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。
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。
相关文章推荐
- 以C++为例子,通过操作内存模拟实现对象的持久化存储(一)
- c/c++ 内存操作函数 宏_条件编译
- C++内存分配操作
- C/C++中的内存操作函数
- C++通过操作内存模拟序列化---实现多种类型的序列化(2)
- C++内存分配操作
- 浅析C++内存分配与释放操作过程——三种方式可以分配内存new operator, operator new,placement new
- c++ 简单的对内存的操作
- C++通过操作内存模拟序列化---实现多种类型的序列化(2)
- [C/C++]更安全的内存操作替代函数
- C++动态内存操作
- C/C++内存操作经典源码(仅供分享)
- c/c++内存操作函数 是否初始化
- C++内存操作
- c++中共享内存操作函数CreateFileMapping解析(一)
- C/C++学习之C提高----函数调用模型、指针做函数参数、字符串的基本操作、一级指针内存模型建立
- 第五章 C++的内存模型和原子操作
- c++中常用的内存操作函数
- c++中共享内存操作函数MapViewOfFile解析(二)
- C/C++--字符串拷贝及内存操作(转载)