C++提出new和delete,主要是解决两个问题:
1、自定义类型对象自动申请的时候,初始化和清理的问题。new/delete会调用构造函数和析构函数
2、new失败了以后要求抛异常,这样才符合面向对象语言的出错处理机制。
ps: delete和free一般不会失败,如果失败了,都是释放空间上存在越界或者释放指针位置不对
new和delete:
new动态申请的对象,申请空间+调用构造函数初始化
delete释放对象时,调用析构函数清理对象中资源,释放空间
Problem:那么为什么C语言中已经有malloc/free,C++也可以用,但是还需要new/delete ?
1、针对内置类型用new还是malloc都是一样的
2、针对自定义类型, new还要调用构造函数完成初始化,delete还要调用析构函数完成清理
结论:C++中建议使用new/delete
operator new:该函数实际通过malloc来申请空间,当ma1loc申请空间成功时直接返回;申请空间失败,尝试执行空间不足应对措施,如果改应对措施用户设置了,则继续申请,否则抛异常。
operator new和operator delete:
1.operator new和operator delete就是对malloc和free的封装
2.operator new中调用malloc申请内存,失败以后,改为抛异常处理错误,这样符合C++面向对象语言处理错误的方式
面试题:malloc/free和new/delete的区别?
总结:
1、new会调用构造函数,失败抛异常,malloc失败了返回0
2、malloc是一个函数,new是一个操作符
3、malloc用法:参数传字节数,返回值是void*, new后面跟申请对象的类型,返回值是类型的指针。