new,delete与malloc,free的区别

首先
new,delete是c++关键字,需要编译器的支持
malloc,free是c的库函数,需要头文件

同时
new在开辟内存时会根据数据类型自动分配,不需要人为指定
而malloc则需要人为指定所需内存的尺寸

成功开辟内存后
new返回的是与对象类型一致的指针
而malloc是返回*void,需要人为进行强制类型转换

当然也有失败的时候
所以需要进行检测
如果失败
new会抛出bad_alloc异常
malloc会返回一个空指针
根据返回的不同,可以来判断是否开辟内存成功

new的实现步骤
1.先用operator new来开辟一块内存空间

2.调用类的构造函数

3.返回相应指针

而对于不同的类,operator new往往需要多次重载来实现对不同

最后还有关于栈和堆以及对象的建立
A a 和 A *p =new a 的理解:

栈是连续内存,由系统来控制,其内的数据执行完就自动删除

而A a就是静态建立对象,由系统直接在栈中开辟内存------移动栈指针,然后直接调用构造函数并在执行完后自动删除


堆是不连续内存,不受系统控制,其内的数据不会自动删除,容量较大
A *p =new a 则是动态建立对象,在堆中进行,先调用合适的operator new()函数来开辟内存空间,然后再调用函数的构造函数

无论是malloc还是free都是在堆上进行的
而new就是在通过malloc在堆上开辟的内存,所以同样需要自己去删除
这里就用到了delete
delete的底层也是先调用类的析构函数,然后用free来释放内存空间

那么两者的差别就可以这样来理解

malloc,free只是单纯的对内存的开辟和释放,它不负责任何东西

而new和delete,会根据对象的不同,来进行构造和析构,并返回对应的指针类型

也就是说new是建立在c++面向对象的特性上建立的,更加完善的为对象服务的开辟以及删除内存的关键字

猜你喜欢

转载自blog.csdn.net/qq_43624038/article/details/114294174
今日推荐