C++一些注意点之new和malloc
来源:互联网 发布:Ubuntu matlab安装教程 编辑:程序博客网 时间:2024/05/22 19:48
整理了一下网上关于这个问题的见解。
malloc/free和new/delete它们都可用于申请动态内存和释放内存,但是它们却有区别:
(1)malloc与free是C++/C语言的内存分配标准库函数,属于stdlib库;new/delete是C++的操作运算符;
(2)new 不止是分配内存,而且会调用类的构造函数,同理delete会调用类的析构函数,而malloc则只分配内存,不会进行初始化类成员的工作,同样free也不会调用析构函数;
例如:
class Obj{public : Obj(void){ cout < < “Initialization” << endl; } ~Obj(void){ cout < < “Destroy” << endl; } void Initialize(void){ cout < < “Initialization” << endl; } void Destroy(void){ cout < < “Destroy” << endl; }}; void UseMallocFree(void){ Obj *a = (obj *)malloc(sizeof(obj)); // 申请动态内存 a->Initialize(); // 初始化 //… a->Destroy(); // 清除工作 free(a); // 释放内存} void UseNewDelete(void){ Obj *a = new Obj; // 申请动态内存并且初始化 //… delete a; // 清除并且释放内存}类Obj的函数Initialize模拟了构造函数的功能,函数Destroy模拟了析构函数的功能。函数UseMallocFree中,由于malloc/free不能执行构造函数与析构函数,必须调用成员函数Initialize和Destroy 来完成初始化与清除工作。函数UseNewDelete则简单得多。所以我们不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete。
(3)内存泄漏对于malloc或者new都可以检查出来的,区别在于new可以指明是那个文件的那一行,而malloc没有这些信息。
(4)返回类型不同:函数malloc 的原型为void * malloc(size_t size),用malloc 申请一块长度为length 的整数类型的内存,返回类型void类型指针(所以在使用malloc的时候你必须手动转换为相应的类型)。而new 返回指定类型的指针,并且可以自动计算所需要大小;
注:为什么free函数不象malloc函数那样复杂呢?这是因为指针p的类型以及它所指的内存的容量事先都是知道的,语句free(p)能正确地释放内存。如果p是NULL指针,那么free对p无论操作多少次都不会出问题。如果p不是NULL指针,那么free对p连续操作两次就会导致程序运行错误。
例如:
int *p;p = new int; //返回类型为int* 类型(整数型指针),分配大小为 sizeof(int);或:int* parr;parr = new int [100]; //返回类型为 int* 类型(整数型指针),分配大小为 sizeof(int) * 100;而 malloc 则必须由我们计算要字节数,并且在返回后强行转换为实际类型的指针。int* p;p = (int *) malloc (sizeof(int));//这里有两点需要注意:(1)必须自己手动转换;(2)必须用sizeof计算空间大小//用malloc分配连续的空间int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100个整数的内存空间。
(5)new和malloc虽然都是申请内存,但申请的位置不同,new的内存从free store分配,而malloc的内存从heap分配(详情请看ISO14882的内存管理部分),free store和heap很相似,都是动态内存,但是位置不同,这就是为什么new出来的内存不能通过free来释放的原因。不过微软编译器并没有很好的执行标准,很有可能把free store和heap混淆了,因此,free有时也可以;
(6)new是类型安全的,而malloc不是。
例如:
int* p = new float[2]; // 编译时指出错误 int* p = malloc(2*sizeof(float)); // 编译时无法指出错误 new operator 由两步构成,分别是 operator new 和 construct
几个注意点:
(1)把new和delete与malloc和free混在一起用也是个坏想法。对一个用new获取来的指针调用free,或者对一个用malloc获取来的指针调用delete,其后果是不可预测的;
(2)delete数组的时候忘了 “[ ]”,容易遗漏对象,造成内存泄露;
(3)malloc申请空间时,不对空间进行检查,造成不可预料的错误。
(4)如果用new 创建对象数组,那么只能使用对象的无参数构造函数。即没有默认构造函数的类,不能用new来创建数组。
- C++一些注意点之new和malloc
- C++一些注意点之new和malloc
- C++一些注意点之new和malloc
- new malloc注意点
- C++一些注意点之operator new 和new operator
- C++一些注意点之operator new 和new operator
- malloc()和free()注意点
- malloc和new之异
- new和malloc的10点区别
- c 的一些注意点
- c风格字符串和string使用的一些注意点
- C++malloc/free和new/delete
- C/C++中 malloc和new区别
- C/C++中 malloc和new区别
- C/C++中 malloc和new区别
- [C++] new 和 malloc 的区别
- C语言编程基础-malloc和new
- C++中要注意的18点(注意malloc/new)
- OpenCV实现图像的旋转
- POJ 1036 Gangsters -- 常规dp 题意好难懂啊
- oracle--压缩
- 黑马程序员 java高新技术<四>--类加载器、动态代理技术的深入讲解与应用
- OpenCV中響應鼠標消息
- C++一些注意点之new和malloc
- 十六进制RGB颜色名称对照表
- 黑马程序员_day09_继承和抽象
- Deep learning:三(Multivariance Linear Regression练习)
- OpenCV中如何累加多幅图像并取平均值
- 钢带缺陷在线检测系统
- 黑马程序员_day10_接口、多态
- ASIHTTPRequest简介
- 可伸缩性的最差实践