目录
C语言内存管理方式:malloc、calloc、realloc和free
C++内存管理方式
new和delete
操作内置类型
操作自定义类型
operator new与operator delete函数
new和delete的实现原理
定位new表达式的了解
编辑
内存泄漏
C语言内存管理方式:malloc、calloc、realloc和free
它们都用于在堆上开辟连续空间,calloc会进行初始化为0,realloc可以调整之前开辟拍的空间(异地扩容或原地扩容)。相同点是空间开辟成功返回分配内存的指针,开辟失败返回NULL。都需要free释放空间。
C++内存管理方式
C++兼容C语言,C语言的内存管理方式当然还可以使用,但一些场景使用起来就有些麻烦。比如对自定义类型的使用。所以C++也有自己的内存管理方式:new和delete。
new和delete
操作内置类型
注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和 delete[],注意:匹配起来使用。
操作自定义类型
注意:在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会。
operator new与operator delete函数
new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的 全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局 函数来释放空间。
我们通过汇编可以看到operator new是通过malloc申请空间的,operator delete是通过free释放空间的。不过不一样的是C++一般使用抛异常来检查空间是否成功申请。
new和delete的实现原理
如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是:new/delete申请和 释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常, malloc会返回NULL。
对于自定义类型:
new的原理
1. 调用operator new函数申请空间
2. 在申请的空间上执行构造函数,完成对象的构造
delete的原理
1. 在空间上执行析构函数,完成对象中资源的清理工作
2. 调用operator delete函数释放对象的空间
new T[N]的原理
1. 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请
2.在申请的空间上执行N次构造函数
delete[]的原理
1. 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理
2. 调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间
定位new表达式的了解
定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象。
使用场景:定位new表达式在实际中一般是配合内存池使用。因为内存池分配出的内存没有初始化,所以如果是自定义类型的对象,需要使用new的定义表达式进行显示调构造函数进行初始化。
内存泄漏
什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不 是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而 造成了内存的浪费。
内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会 导致响应越来越慢,最终卡死。