【让你的C++程序更加高效】条款03:尽量使用new/delete而不是malloc/free
来源:互联网 发布:js删除数组最后一个 编辑:程序博客网 时间:2024/06/05 23:14
首先说明一下
new/delete是C++的operator(操作符,比如+,-,*,/,==,!等都是操作符)
malloc/free是function(函数),在堆(heap)上分配内存/回收内存
假设现在要为一个(或一组)对象分配空间,不再使用时进行内存回收,两个方面依次讨论
开辟存储空间
旧式malloc函数只是分配所请求大小的存储空间并返回首地址,但不做其他事情
新式new操作符不仅分配存储空间而且注意到目标对象的constructor(构造函数)并按照合适方式调用
这就意味着,使用new操作符不仅为这个(这组)对象开辟开辟了空间,而且这个(这组)对象可以立即使用
但mallo函数只管分配空间,而这个(这组)变量没有被初始化,也许不能立即使用(参见“使用前请初始化”,“使用未初始化的变量/对象会导致未定义/不可预知的行为”)
注意这里暂且不管“内存分配失败”等异常
回收存储空间
对应的,free函数只是简单的执行内存回收工作
操作符delete则首先检查destructor(析构函数),如果可以就先进行析构,然后再回收内存
有时候使用malloc/free是没有问题的,例如我想分配一个大型的int数组用完之后再释放
但是在C++面向对象环境下还是使用新式的new/delete操作符,因为object的大量使用需要特别谨慎
以上第一层次的分析就足以说明这种转换的好处
在使用时还需要注意
1.配对使用,就是说malloc搭配free,new搭配delete,否则可能会出事
2.当new开辟的是对象数组时,请配合使用delete [] 以明确行为
举个例子
string *stringArray1 =static_cast<string*>(malloc(10 * sizeof(string)));string *stringArray2 = new string[10];前者string数组是未经过初始化的,某些行为“不安全”,例如stringArray1[0].c_str();
后者则是经过了初始化
释放内存请使用
free(stringArray1);delete [] stringArray2;
其他细节稍后补充
注意:本条款以及后续许多条款在大多数情况下是effective的建议,但并不是绝对的。
本文原创,条款内容以及详解部分内容参考《(More) Effective C++》,条款编号无先后关系
博文原始地址
http://blog.csdn.net/fengyhack/article/details/39667171
0 0
- 【让你的C++程序更加高效】条款03:尽量使用new/delete而不是malloc/free
- 【让你的C++程序更加高效】条款01:尽量使用常量/内联而不是预处理器/宏定义
- 条款3,4:尽量用new和delete而不用malloc和free 尽量使用c++风格的注释
- Effective C++:条款3:尽量用new和delete而不用malloc和free
- 尽量使用new/delete操作符,而不是malloc/free来分配内存-------Effective C++学习笔记
- c++:尽量用new/delete代替malloc/free
- c++: new, delete, malloc, free的匹配使用
- 条款3:尽量用new和delete而不用malloc和free
- Effective C++学习笔记:条款3:尽量用new和delete而不用malloc和free
- Effective C++条款3:尽量用new和delete而不用malloc和free
- 条款3:尽量用new和delete而不用malloc和free
- 条款3:尽量用new和delete而不用malloc和free
- 条款3:尽量用new和delete而不用malloc和free
- malloc free和new delete的使用
- 改善C++ 程序的150个建议学习之建议21:尽量用new/delete代替malloc/free
- C/C++内存使用之malloc/free,new/delete
- [C/C++] malloc/free和new/delete的区别
- 尽量用new和delete而不用malloc和free
- Eclipse4.2.2安装GlassFish插件
- madplay移植过程 - 音频mp3解码器
- GDB 调试正在运行的程序
- 【.Net码农】C#打开文件对话框(OpenFileDialog)
- Linux的watch命令 — 实时监测命令的运行结果
- 【让你的C++程序更加高效】条款03:尽量使用new/delete而不是malloc/free
- 【Cocos2d-x 3.2】在Cocos2d-x中开启VAO(为Vertex Array Object)
- 简单形象理解网络传输过程--读书笔记
- UI设计---化繁为简
- 职场分享:如何让我们的工作更加有激情
- Content-Disposition的使用方法
- 网络爬虫爬取策略,注意爬虫爬取网站的频率
- 【.Net码农】File Class
- 程序员生存定律--升华成高手的可能方法