c++内存管理 《C++内存分布》《C语言中动态内存管理》《new 与delete的实现原理》《定位new表达式》

一.C++内存分布:
c++内存管理 《C++内存分布》《C语言中动态内存管理》《new 与delete的实现原理》《定位new表达式》
说明:
1.栈又叫堆栈,费静态局部变量/函数参数/返回值等等,栈是向下生长的。
2.内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库,用户可使用系统接口创建共享内存,做进程间通信
3.用于程序运行时动态内存分配,堆是向上增长的。
4.数据段—存储全局数据和静态数据。
5.代码段—可执行的代码/只读常量。

二.C语言中动态内存管理方式
1.malloc/calloc/realloc和free
都是用来进行动态内存申请的库函数,申请的空间在堆上,用完后使用free释放,返回值都是void*。
malloc**返回值void*,接受返回的空间地址时必须要强转,**成功返回首地址,失败 NULL,free释放。

calloc调用形式为(类型*)calloc(n,size):在内存的动态存储区中分配n块长度为“size”字节的连续区域,返回首地址。基本与malloc相同,但是calloc会对其申请的空间进行初始化。

relloc(void* p ,size_t, size)将p所指向的空间大小调整到size字节

c++内存管理 《C++内存分布》《C语言中动态内存管理》《new 与delete的实现原理》《定位new表达式》
此处不需要再free(p2)

2.C++内存管理方式
通过new和delete操作符进行动态内存管理
2.1new/delete操作内置类型

c++内存管理 《C++内存分布》《C语言中动态内存管理》《new 与delete的实现原理》《定位new表达式》
注意:申请和释放单个元素空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[].
c++内存管理 《C++内存分布》《C语言中动态内存管理》《new 与delete的实现原理》《定位new表达式》c++内存管理 《C++内存分布》《C语言中动态内存管理》《new 与delete的实现原理》《定位new表达式》
注意:在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc和free不会。

三.new与delete的实现原理
1.内置类型:
如果申请的是内置类型的空间,new和malloc,free和delete基本类似,不同的地方是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请失败时会抛出异常,malloc会返回NULL.

2.自定义类型:
new的原理:
1)调用opertor new 函数申请空间
2)在申请空间上执行构造函数,完成对象的构造
delete的原理
1)在空间上执行析构函数,完成对象中资源的清理工作
2)调用operator delete函数释放对象的空间

4.定位new表达式:
点位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象
使用场景:定位new在实际中一般是配合内存池使用。因为内存池分配的内存没有初始化所以如果是自定义类型的对象,需要使用new的定位表达式进行显示调构造函数进行初始化。
c++内存管理 《C++内存分布》《C语言中动态内存管理》《new 与delete的实现原理》《定位new表达式》