目录
二、malloc/free和new/delete的共同点和区别
一、new/delete的原理
1.new的原理
1.调用operator new函数申请空间
2.在申请的空间上执行构造函数,完成对象的构造
(operator new + 构造)
2.new DataType[N]的原理
1.调用operator new[]函数,在该函数中实际是调用operator new函数完成N个对象空间的申请
2.在申请的空间上执行N次构造函数
3.delete的原理
1.在空间上执行析构函数,完成对象中资源的清理工作
2.调用operator delete函数释放对象的空间
(析构 + operator delete)
4.delete[]的原理
1.在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理
2.调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间
二、malloc/free和new/delete的共同点和区别
共同点:都是从堆上申请空间,并且需要用户手动释放。
不同点:
1.malloc和free是标准库函数,行为固定,不可重载,new和delete属于操作符,operator new/operator delete可以被重载(全局或类内重载),能自定义内存分配逻辑
2.malloc申请空间时,需要手动计算空间并传递,new只需要在其后跟上空间的类型即可,如果时多个对象,[]中指定对象个数即可
3.malloc申请的空间只能是指定大小的内存块,且不会初始化,尤其是自定义类型,而new可以初始化
如int* ptr = new int(8) 或 int* ptr = new int[3]{1,2,3}
4.malloc的返回值为void* ,在使用中必须强制转换类型,存在类型安全差异,而new不需要,因为new后直接跟的是空间的类型
5.malloc申请失败时,返回的是NULL,因此使用时必须判空,避免空指针非法引用,new不需要,new失败时会抛出异常(默认行为)
6.申请自定义类型对象时,malloc和free只会开辟和释放空间,不会调用构造函数和析构函数,而new在申请空间后会调用构造函数来完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理释放
7.new分配的内存必须由delete释放(new[]对应delete[]),malloc分配的内存也必须由free释放,如果混用则可能导致未定义行为,如析构函数不被调用、内存泄漏等问题。