目录
C/C++内存分布
引入
分析
说明
C语言内存管理方式:malloc calloc realloc free
malloc
realloc
calloc
面试题
C++内存管理方式
new/delete操作符
用法
new和delete操作自定义类型
operator new和operator delete函数
operator new
编辑
operator delete
总结
定位new
常见面试题
malloc/free和new/delete的区别
内存泄漏(了解)
C/C++内存分布
引入
栈区:函数参数,局部变量,编译器自动释放内存
堆区:动态内存申请的空间,程序员分配释放,如果不释放,可能会引起内存泄漏
代码区:代码
数据段:const修饰的变量,全局变量,静态变量
常量区:常量,字符串
分析
我们看以下代码
sizeof:求字节大小
strlen:求字符串中字符个数,\0结束
说明
C语言内存管理方式:malloc calloc realloc free
realloc是在原空间上继续扩大空间,p2和p3指向同一篇空间,两次free报错
malloc
动态开辟内存
realloc
扩大空间
原地扩容:在已经开辟空间后面接着开辟空间
异地扩容:原开辟空间后面无法接着开辟开空间,就拷贝之前空间的内容到新空间,接着扩大空间,并释放掉之前的空间
calloc
开辟空间并将空间初始化
面试题
malloc/calloc/realloc的区别
C++内存管理方式
C语言内存管理在c++中可以继续使用,但是有些方面用起来比较麻烦,C++提出了自己的内存管理方式,通过new和delete操作符进行
new/delete操作符
new和delete就相当于C语言中的malloc和free,但是new和delete在申请自定义类型空间的使用会调用构造函数和析构函数
用法
申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[ ]和delete[ ];
注意要匹配使用!
new和delete操作自定义类型
注意:与malloc/free不同的是,new/delete在对于自定义类型开空间的同时还会调用构造函数和析构函数
operator new和operator delete函数
new和delete是用户进行动态内存申请的操作符,operator new和operator delete是系统提供的全局函数,new在底层调用operator new来开辟空间,delete在底层调用operator delete来释放空间
operator new
operator delete
总结
opeartor new也是malloc来申请空间,如果成功申请就直接返回,否则执行用户提供的空间不足的应对措施,如果用户提供措施就继续执行,否则就抛异常(try catch函数)
operator delete最终也是通过free来释放空间
定位new
定位new表达式是在已分配原始内存空间中调用构造函数初始化一个对象
new(地址)type 或者 new(地址) type (参数)
new(pst)stack(4)
显示调用构造函数
一般配合内存池使用
常见面试题
malloc/free和new/delete的区别
从用法和底层原理来说明
用法:
1.malloc和free是函数,new和delete是操作符
2.malloc开辟的空间不可以初始化,new可以初始化
3.malloc申请空间需要手动计算空间大小,new只需要跟上空间类型即可,如果是多个对象,就在[ ]说明数组元素个数
4.malloc返回值是void*,使用时必须强转,new不需要,后面跟的就是空间类型
5.malloc申请失败是返回NULL,使用必须判空,new失败是抛出异常,需要捕获异常
底层原理:
6.在申请自定义类型对象时,malloc和free只会开辟空间,不会调用构造和析构函数
而new在申请空间成功后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理
内存泄漏(了解)
用户使用内存后没有及时清理
内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现