C和C++内存管理(newmalloc和freedelete)
Posted yumoz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C和C++内存管理(newmalloc和freedelete)相关的知识,希望对你有一定的参考价值。
一图读懂内存分配
总结一下:
- 栈(堆栈),存放非静态局部变量、函数参数、返回值等
- 堆,用于程序运行时动态内存分配。
- 数据段, 存储全局数据和静态数据
- 代码段,存放可执行的代码,或者只读常量
malloc、calloc和realloc区别?
- malloc是在堆上动态开辟空间;
- calloc是堆上开空间+初始化为0;
- realloc是对已有空间的扩容,扩容有两种方式(原地扩容和异地扩容)
原地扩容和异地扩容的差异就在扩容后地址变了。
下面体验一下calloc的初始化:
new & delete
对比new/malloc、delete/free
void BlogTest()
{
int *p1 = (int*)malloc(sizeof(int) * 10);
//申请 一个 10个int的数组
int *p2 = new int[10];
free(p1);
delete[]p2;
int *p3 = (int*)malloc(sizeof(int));
//申请 一个 单个int的数组
int *p4 = new int;
free(p3);
delete p4;
}
new 申请空间+初始化
new & delete操作自定义类型
先看C语言中malloc使用:
感受一下 new 和 delete 和 C语言中 malloc和free的区别:
再次感受一下new和delete的的作用:
发现:申请几个对象调用几次构造函数,对应也应执行几次析构函数。
operator new & operator delete
new和delete是用户进行动态内存管理的操作符,但是在低层,他是通过operator new 和operator delete来实现的。operator new实际是通过malloc 来申请空间,operator delete 低层也是通过free来释放空间的。
new 和 delete分析
对于内置类型,如果申请内置类型空间,new/delete 是申请释放单个元素空间,new[]/delete[]是申请释放连续空间;且new在空间申请失败时会抛出异常,malloc则会返回NULL。
对于自定义类型,new是1)调用operator new申请空间,2)在申请的空间执行构造函数初始化; delete是1)在孔家先执行析构函数完成清理工作,2)调用operator delete完成对象孔家的释放。对于 new[] 和 delete[]本质是一样,前者先使用operator new完成N个对象空间的申请,再接着在对应空间上使用构造函数N次完成初始化。析构同理,这里不载赘述。
malloc/free 与 new/delete比较
共同点:都是在堆上申请空间,都需要用户手动释放。
不同点:
- malloc 、 free 是函数 ,new 、delete是操作符
- malloc出来的空间不会初始化,new可以
- malloc申请空间时,需要自己计算空间大小,new只需要在其后跟上空间类型即可,对于多个对象new时,只需要在对应“[]”里填上指定对象个数即可
- malloc返回值为void* ,使用时需要强转,new不需要(new后接着空间类型)
- malloc失败时返回NULL,使用时必须判断是否为空,new不需要,但new需要捕捉异常
- malloc 和 free在申请对象时不会调用构造函数和析构函数,但是new和delete会调用对应的构造函数和析构函数。
以上是关于C和C++内存管理(newmalloc和freedelete)的主要内容,如果未能解决你的问题,请参考以下文章