内存管理:
new的定位表达式:new (place_address) type或者new (place_address) type(initializer-list)place_address必须是一个指针,initializer-list是类型的初始化列表
一、malloc/free/new/delete的区别malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。不同的地方是:
1. malloc和free是函数,new和delete是操作符
2. malloc申请的空间不会初始化,new可以初始化
3. malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可
4. malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型
5. malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常
6. 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间 后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理
7. new/delete比malloc和free的效率稍微低点,因为new/delete的底层封装了malloc/free栈上的空间编译器会自动释放,堆上的空间必须手动释放
二、设计一个类,只能在堆上创建对象:
1.构造函数私有化;
2.提供公共接口:在堆上创建对象
3.在类外无法创建对象,函数用类名调用,公共接口必须为static接口
4.防止拷贝:<1>拷贝构造私有化,只声明不实现(若在类外实现并且可以利用友元函数创建);<2>拷贝构造声明成delete函数(删除函数)删除函数:函数+“=delete”。删除函数在任何地方都不能被调用。
三、设计一个类,只能在栈上创建对象(屏蔽new的功能)
第一种方法:
1.构造函数私有化,间接阻止new关键字的执行逻辑
2.提供公共接口:在栈上创建对象
3.在类外无法创建对象,函数用类名调用,公共接口必须为static接口
第二种方法:
1.重载operator new函数,声明成私有,并且不实现
2.构造函数公有
四、单例模式:一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享(全局只有唯一一份)
1.饿汉模式:优点:简单 缺点:可能会导致进程启动慢,且如果有多个单例类对象实例启动顺序不确定。
2.懒汉模式:优点:第一次使用实例对象时,创建对象,进程启动无负载。多个单例实例启动顺序自由控制缺点:复杂(加锁:为了保证(双线程并行运行)创建唯一一个对象;两次判断:减少加锁花费的开销,提升性能)
五、内存泄漏
内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制(指向该空间的指针丢了),因而造成了内存的浪费。内存泄漏分类:堆内存泄露:堆内存指的是程序执行中依据须要分配通过malloc / calloc / realloc / new等从堆中分配的一块内存, 用完后必须通过调用相应的 free或者delete 删掉。假设程序的设计错误导致这部分内存没有被释放,那 么以后这部分空间将无法再被使用,就会产生Heap Leak系统资源泄漏:指程序使用系统分配的资源,比方套接字、文件描述符、管道等没有使用对应的函数释放掉,导致系统 资源的浪费,严重可导致系统效能减少,系统执行不稳定。将程序编译改为x64进程,可以一次性申请4G的内存
C++内存管理
最新推荐文章于 2025-08-08 01:27:43 发布