new和malloc的区别,深拷贝和浅拷贝
new和malloc的区别
1、new是运算符,malloc是库函数,需要头文件(#include<stdlib>)
2、new有初始化的功能,malloc没有
3、new和malloc都是申请内存的方式,但内存释放方式不一样,分别是delete和free
4、new返回的是与对象类型匹配的对象指针,malloc返回的是void*类型,需要类型强制转换
5、new运算符可以被重载,malloc不可以
6、内存申请失败的时候返回值不一样,new返回bac_alloc异常,malloc返回空(NULL)
7、new操作符和malloc函数从堆上动态分配内存
为啥要有两种不一样的申请内存方式,有一个不就够了吗?
对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求(对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数)
由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
深拷贝和浅拷贝
浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址,
深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存,
深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。
假设B复制了A,修改A的时候,看B是否发生变化:
如果B跟着也变了,说明是浅拷贝,拿人手短!(修改堆内存中的同一个值)
如果B没有改变,说明是深拷贝,自食其力!(修改堆内存中的不同的值)
深拷贝和浅拷贝的缺点
浅拷贝因为两个对象的指针指向同一块内存,这两个对象指针生命周期结束的时候都会调用析构函数,那么这一块内存空间会被析构两次,所以程序会崩溃。
如果改变一个对象指针指向的值,另一个对象指向的值也会改变,因为这两个指针指向同一块空间
解决浅拷贝的多次析构问题,可以在引用指针的时候加入引用计数---------智能指针
使用深拷贝拷贝数据的时候,消耗的资源更大。