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