malloc/free与new/delete有什么不同?

  1. 操作对象不同
    (1) malloc/free是C/C++语言的标准库函数,而new/delete是C++的运算符
    (2) 由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,所以无法执行构造和析构函数
    (3) new的执行过程:首先调用名为operator new的标准库函数,分配足够大的原始的未类型化的内存,保存指定类型的一个对象;然后运行该类型的一个构造函数,用指定初始化式构造对象;最后,返回指向新分配并构造的对象的指针
    (4) delete执行过程:首先对sp指向的对象运行适当的析构函数,然后通过调用名为operator delete的标准库函数释放该对象所用内存
  2. 用法不同
    对于函数malloc
    (1) malloc 返回值为void*,所以在调用时要显示的进行类型转换,将void*转换成所需要的指针类型。
    (2) malloc函数本身并不识别要申请的内存是什么类型,只关心内存的总字节数
    对于函数delete
    (1) free(p)用来释放内存,若p为NULL指针,则free对p无论操作多少次都不会出现问题,否则,对p连续两次操作就会导致程序运行出错
    对于运算符new
    (1) int *p=new int[length]; new内置了sizeof,类型转换和类型安全检查功能。对于非内部数据类型的对象而言,new在创建动态对象的同时完成了初始化工作。如果对象有多个构造函数,那么new的语句也有多种形式

基于以上总结:
(1) malloc和free是C/C++语言的标准库函数,new/delete是C++的运算符
(2) new自动计算需要分配的空间,而malloc需要手工计算字节数
(3) new是类型安全的,而malloc不是,比如:
int* p=new float[2];//编译时无法指出错误
int* p=(int*)malloc(2*sizeof(double));//编译时无法指出错误
(4) new调用operator new分配足够的空间,并调用相关对象的构造函数,而malloc不能调用构造函数;delete将调用该实例的析构函数,然后调用类的operator delete,以释放该实例占用的空间,而free不能调用析构函数
(5) malloc/free 需要库文件支持, new/delete则不需要。

猜你喜欢

转载自blog.csdn.net/imprincess/article/details/79574661