malloc/free和new/delete
来源:互联网 发布:大数据视频百度云 编辑:程序博客网 时间:2024/04/29 18:17
一、相同点
1. 都可以用来动态的分配和释放内存。
二、不同点
1. malloc/free是C的库函数,而new/delete是C++的操作符。
2. malloc不能用来动态创建对象。对象需要在创建的时候调用构造函数,在销毁的时候调用析构函数。但是因为malloc/free是库函数而非操作符,编译器对之无控制权。而new/delete可以用来动态的创建销毁对象。
3. 当分配内存出错时,malloc返回NULL,new则有两种处理方法:抛出bad_alloc异常,或者返回NULL(这是编译器相关的)。如果不处理此异常,系统则调用C++标准库中的terminate()函数,在默认情况下,terminate()将调用abort()终止程序。如果你不想new抛出异常,可以调用new的无异常版本:new(std::nothrow)。
4. malloc返回的值为void*,因而需要类型转换;而new返回的指针有类型信息。
三、注意
1. 如果使用free去释放由new创建的对象,会出问题,因为free无法调用析构函数,析构函数里作的工作将不再被做(编译链接没有问题)。如果用delete去释放由malloc创建的内存,没有问题,但可读性差。故而最好配套使用。
四、例子
class Base{public:Base(){cout<<"constructor";}~Base(){cout << "destructor";}};int main(){cout << "pB1:\n";Base* pB1 = (Base*)malloc(sizeof(Base));delete pB1;cout << endl << "pB2:\n";Base* pB2 = new Base;free(pB2);system("pause");return 0;}输出为:
可见,用malloc时未调用构造函数,用free时未调用析构函数。
参考:
1. http://www.pixelstech.net/article/index.php?id=1340193129
2. http://blog.csdn.net/onlyonename/article/details/8655324
- malloc/free和new/delete
- new/delete 和 malloc/free
- malloc free 和new delete
- malloc/free和new/delete
- malloc/free 和 new/delete
- malloc/free和new/delete
- new/delete和malloc/free
- malloc/free和new/delete
- new、delete和malloc、free
- malloc-free和new-delete
- new/delete和malloc/free
- malloc/free和new/delete
- malloc()、free()和new、delete
- new,delete和malloc,free
- malloc/free和new/delete
- malloc/free和new/delete
- malloc/free和new/delete
- new/delete 和 malloc/free
- 添加用户 组
- Request和Response详解
- 导航
- struts2 的国际化支持
- iOS: NSKeyedArchiver的方法finishEncoding
- malloc/free和new/delete
- 成都传智播客hibernate视频下载及讲师介绍
- 浅谈 common lisp NIL
- 遇到的问题--------C#连接数据库的语句带特殊字符时无法解析
- 使用jquery操作iframe
- PupupWindow(五)---设置动画
- 大流量网站架构
- JSON C# Class Generator ---由json字符串生成C#实体类的工具
- python with/as