C/C++动态内存管理

    C语言动态内存管理

C语言使用malloc/calloc/realloc/free 进行动态内存管理

1.malloc/calloc/realloc的区别

三个函数的的声明是:

void *malloc(unsigned size);

void *calloc(size_t  numEles,size_t sizeofEle);

void *realloc(void *ptr,unsigned newsize);

malloc用于申请一段新的地址,不初始化内容,一个参数size为申请内存空间的长度;

colloc用于申请一段新的地址,并初始化为零,第一个参数表示申请地址的单位元素长度,第二个表示元素个数;

realloc是给一个已经分配了地址的指针重新分配空间,第一个参数表示原有的地址,第二个表示重新申请的地址长度。

三者均在stdlib.h库函数中,都是请求系统分配空间,若申请失败就返回NULL。

free的调用形式为free(void *ptr):释放ptr所指向的一块内存空间。

void Test()

{

   int *p1=(int*)malloc(sizeof(int)*4);

   int *p2=(int*)calloc(4,sizeof(int));

   int *p3=(int*)realloc(p2,sizeof(int)*6);

   free(p1);

   free(p3);//此处不需释p2,因为p3已经指向p2的位置。

}

 C++动态内存管理

C++通过new和delete动态管理内存

new/delete动态管理对象

new[]/delete[]动态管理数组对象

注意malloc/free、new/delete、new[]/delete[]一定要匹配使用!否则可能出现内存泄漏甚至崩溃的问题。

   内存管理

全局变量,静态全局变量,局部静态变量,局部变量之间的区别是什么?

局部变量在整个工程文件中都有效,静态全局变量只在定义它的文件中有效,局部静态变量只在定义它的函数中有效,并且内存只分配一次内存函数返回后改变量不会改变,这三个变量都位于静态存储区;而局部变量在定义它的函数内有效,函数返回后失效,变量放在内存的栈区。

1、栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。

2,、堆用于程序运行时动态内存分配,堆是可以向上增长的。

3、数据段—存储全局数据和静态数据。

4、代码段—可执行的代码/只读代码。

malloc/free和new/delete的区别和联系

1、他们都是动态管理内存的入口,

2、malloc/free是C/C++标准库的函数,new/delete是C++操作符,

3、malloc/free只是动态分配内存/释放内存,而new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理,

4、malloc/free需要手动计算类型大小且返回值是void*,new/delete可自己计算类型大小,返回对应类型的指针。

C++的其他内存管理接口

void*  operator   new(size_t size);

void   operator   deleyte(size_t size);

void* operator   new[](size_t size);

void   operator   delete[](size_t size);

总结:operator new/operator delete operator new[]/operator delete[]和malloc/free用法一样,他们只是负责分配空间/释放空间,不会调用对象的构造函数/析构函数来初始化/清理对象,实际operator new和operator delete只是malloc/free的一层封装。

new做了两件事:

1、调用operator new分配空间。

2、调用构造函数初始化对象。

delete做了两件事:

1、调用析构函数清理对象。

2、调用operator delete释放空间。

new[N]

1,、调用operator new分配空间。

2、调用N次构造函数分别初始化每个对象。

delete[]

1、调用N此析构函数清理对象。

2、调用operator delete释放空间。

深度剖析new/delete&new[]/delete[]

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值