一. 全局/局部和静态/非静态类型变量的区别
二. C/C++内存分布
不同变量存在不同的空间中,这些空间主要分为栈,堆,数据段,代码段。
栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的
堆用于程序运行时动态内存分配,堆是可以上增长的
数据段–存储全局数据和静态数据。
代码段–可执行的代码/只读常量。
三. C/C++内存管理方式
1. C内存管理方式
PS:malloc/calloc/realloc/free都是C库函数
1.1 malloc/calloc/realloc/free的使用方法
2.1 malloc/calloc/realloc使用效果的区别
malloc:只是单纯的开辟空间。
calloc:开辟空间后,把空间内容一个字节一个字节的初始化为0
realloc:如果后面空间足够,在原有的空间上进行扩容;后面空间不够的话拷贝原空间的数据到新扩容的另一块空间上,并自动释放原空间。
2. C++内存管理方式
PS:new/delete是操作符
C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。
申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[]
四. operator new与operator delete函数
PS:operator new 和operator delete是系统提供的全局函数。
1. operator new
1.1 概念
底层还是以依靠malloc函数实现开辟空间,只不过增加了开辟空间失败后的抛异常功能(malloc开辟空间失败后返回0)。
1.2 operator new和malloc的区别
使用方式一样,处理错误的方式不一样
2 operator delete
2.1 概念
底层是通过free来释放空间的,为了与operator new配套才出现的,与free没什么区别。
2.2 operator delete与free
使用方式一样,处理错误的方式也一样(释放空间失败直接终止进程)。
五. new和delete实现原理
new:operator new + 构造函数
delete:析构函数 + operator delete
1. 内置类型
new和malloc,delete和free基本类似,就是空间开辟失败时处理错误的方式不一样。
2. 自定义类型
new:调用operator new函数申请空间 + 调用构造函数完成初始化
delete:调用析构函数完成清理工作 + 调用operator delete函数释放空间。
六. malloc/free和new/delete的区别
本质: malloc/free是函数;new/delete是操作符
使用方法:开辟和释放连续空间时要用new[ ] 和 delete[ ],而malloc/free对于一个类型的空间和连续的空间都一样方法。
使用效果:new/delete会有开辟空间失败后的抛异常处理,并且开辟空间后不要可以自动识别空间类型。
七. 定位new
对于自定义类型,new开辟的空间会自动调用构造函数完成初始化。那么malloc开辟的自定义类型对象的空间怎么初始化呢?
1. 概念
在已分配的原始内存空间中显示调用构造函数初始化一个对象,它是一个操作符。
2. 用法
new (place_address) type或者new (place_address) type(initializer-list)
place_address必须是一个指针
initializer-list是类型的初始化列表
左边那个是调用默认构造函数的的形式(不传参),右边那个是调用带参数的默认构造函数的形式。
七. 内存泄漏
1. 概念
原本开辟的空间不要了,,因为忘记或者其他原因没有释放这块空间,就造成内存泄漏。
内存泄漏不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
区别野指针:野指针是一个指针变量指向不属于该程序的空间。
2. 危害
对长期运行的程序(如游戏后台服务)或者设备内存本身就很小的情况内存泄漏出现内存泄漏会导致响应越来越慢,最终卡死。
3. 如何避免内存泄漏
事前预防型:如智能指针等
事后查错型:如泄漏检测工具