内存管理

目录

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修饰的变量,全局变量,静态变量

常量区:常量,字符串

分析

我们看以下代码

内存管理_第1张图片

内存管理_第2张图片

内存管理_第3张图片

sizeof:求字节大小

strlen:求字符串中字符个数,\0结束

说明

内存管理_第4张图片

C语言内存管理方式:malloc calloc realloc  free

内存管理_第5张图片

内存管理_第6张图片

realloc是在原空间上继续扩大空间,p2和p3指向同一篇空间,两次free报错

内存管理_第7张图片

malloc

动态开辟内存

realloc

扩大空间

原地扩容:在已经开辟空间后面接着开辟空间

异地扩容:原开辟空间后面无法接着开辟开空间,就拷贝之前空间的内容到新空间,接着扩大空间,并释放掉之前的空间

calloc

开辟空间并将空间初始化

面试题

malloc/calloc/realloc的区别

 C++内存管理方式

C语言内存管理在c++中可以继续使用,但是有些方面用起来比较麻烦,C++提出了自己的内存管理方式,通过new和delete操作符进行

new/delete操作符

new和delete就相当于C语言中的malloc和free,但是new和delete在申请自定义类型空间的使用会调用构造函数和析构函数

用法

内存管理_第8张图片

申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[ ]和delete[ ];

注意要匹配使用!

new和delete操作自定义类型

注意:与malloc/free不同的是,new/delete在对于自定义类型开空间的同时还会调用构造函数和析构函数

内存管理_第9张图片

内存管理_第10张图片

内存管理_第11张图片

 operator new和operator delete函数

new和delete是用户进行动态内存申请的操作符,operator new和operator delete是系统提供的全局函数,new在底层调用operator new来开辟空间,delete在底层调用operator delete来释放空间

operator new

内存管理_第12张图片

operator delete

内存管理_第13张图片

总结

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在释放空间前会调用析构函数完成空间中资源的清理 

内存泄漏(了解)

用户使用内存后没有及时清理

内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现

内存泄漏会导致响应越来越慢,最终卡死

你可能感兴趣的:(c++,c++,开发语言)