1、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不需要,但是需要捕获异常
6、申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造和析构,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理
7、new/delete比malloc和free的效率稍微低点,因为new/delete的底层封装了malloc和free
2、设计一个类,该类只能在堆上创建对象
思路:
构造函数私有化
1、将类的构造函数私有,拷贝构造声明成私有,防止别人调用拷贝在栈上生成对象
2、提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建
class HeapOnly
{
public:
static HeapOnly* CreatObject()
{
return new HeapOnly;
}
private:
HeapOnly()
{
}
HeapOnly(const HeapOnly&);
HeapOnly(const HeapOnly&) = delete;
};
3、设计一个类,该类只能在栈上创建对象
思路:
只能在栈上创建,即不能在堆上创建,因此只要将new的功能屏蔽掉即可,屏蔽掉operator new和定位new表达式
4、单例模式
一个类只能创建一个对象,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点
饿汉模式:
一上来就加载
懒汉模式
延迟加载,启动快,控制多个单例的实例化顺序
static single* gteInstance() { if (_ps == nullptr) { mtx.lock(); if (_ps == nullptr) { _ps = new single; } mtx.unlock(); } return
5、内存泄漏
是指因为疏忽或错误造成程序未能释放已经不再使用内存的情况,内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成内存的浪费
一般分为:堆内存泄漏、系统资源泄漏