学习笔记II——new/delete和malloc/free

来源:互联网 发布:java文件上传实现原理 编辑:程序博客网 时间:2024/03/29 21:22
    上次网易面试也问到了这个问题,本来是一个很常见的问题,但真正回答起来发现好多地方不能很快的概括出来。于是现在总结一下。个人总结,有不妥之处,若有人看到,欢迎拍砖。    new/delete和malloc/free都是C++用于动态内存管理的。先总结一下他们的相同点和不同点。一、相同点:   都可以用于申请动态内存。二、不同点:1,操作对象不同。由于malloc/free是库函数,因此对于非内部对象,由于在对象创建和销毁时要执行构造函数和析构函数,malloc/free是不能满足动态对象的要求的(不能把执行构造函数和析构函数的任务强加于他们,他们是库函数,不在编译器控制权限之内)。2,用法上有所不同。malloc的返回类型是void *,因此在申请对象时要进行显示的强制类型转换(有些转换是默认的,但最好都显示的写出来,以免出错),另外,malloc不能识别数据类型,它只关心总的字节数。对于free,当p是NULL指针时,执行多少次free(p)都不会出错,但如果p不是NULL指针,连续free两次就会出错。new内置了sizeof,数据类型转换和类型安全检查,对非内部数据对象,new在创建对象的同时会调用构造函数进行初始化,而且如果有多个构造函数,则可以有多种new的方式,当new创建一个数组时,只能调用无参构造函数,delete在销毁一个非内部对象的对象时,会调用析构函数。另外注意销毁一个数组时要写上delete [],否则运行不会出错,但只会销毁第一个元素,比如int *p = new int[100]; delete p;执行这两条语句之后,由于第二条相当于delete p[0];因此会导致其他99个元素的空间没有释放,正确的做法应该是delete []p。另外,在具体使用的时候,要注意以下区别。1,new会自动计算空间(内置了sizeof),malloc要手工计算字节数,还要进行强制类型转换。2,new是类型安全的,而malloc不是。比如:int *p = new double[2];会出错,而int *p = malloc(2 * sizeof(double));不会有编译错误。3,new由两部分构成:new操作符,它对应于malloc,可以重载从而自定义内存分配策略,但malloc是不能做到这些的;new调用constructor,malloc不调用constructor,想对应的,delete会调用destructor,而free不会。4,malloc/free是库函数,要头文件支持(stdlib.h)。总结一下二者的本质区别和联系。对于malloc/free和new/delete,他们的本质区别是:malloc/free是库函数而new/delete是操作符。联系:都可以用于动态内存管理,而且malloc/free和new/delete都应该配对使用。需要注意的是:free是不能用于释放new创建的动态对象的(因为free不能调用析构函数),但delete可以用于释放malloc分配的内存,不过这回影响程序的整洁和可读性,所以最好还是都配对使用。
原创粉丝点击