网站首页 > 技术文章 正文
前言
malloc 和 free是C语言中的库函数,在C++的应用中使用会产生问题,原因在于它们太简单:他们不知道构造函数和析构函数。
初始化
用两种方法给一个包含 10 个 string 对象的数组分配空间,一个用malloc,另一个用 new:
//array1 指向的是可以容纳 10 个 string 对象的足够空间,但内存里并没有创建这些对象。
string *array1 = static_cast<string*>(malloc(10 * sizeof(string)));
//1.array2 指向的是一个包含 10 个完全构造好的 string 对象的数组
//2.每个对象可以在任何位置读取 string 的操作里安全使用。
string *array2 = new string[10];
内存回收
/*
*1.调用 free 将会释放 array1 指向的内存,但内存里的 string 对象不会调用析构函数。
*2.如果 string 对象已经分配了内存,那这些内存将会全部丢失,将会造成内存泄漏。
*/
free(array1);
delete [] array2; //delete,数组里的每个对象都会在内存释放前调用析构函数。
既然 new 和 delete 可以这么有效地与构造函数和析构函数交互,选用它们是显然的。
混搭风
1.把 new 和 delete 与 malloc 和 free 混搭使用也是个坏想法---结果是不可预测的:它可能在开发阶段工作良好,在测试阶段工作良好,但也可能会最后在你最重要的客户的面前爆炸。
2.new/delete 和 malloc/free 的不兼容性常常会导致一些严重的复杂性问题。
举个例子,<string.h>里有个 strdup 函数
/*
*strdup()会先用malloc()配置与参数ps 字符串相同的空间大小,
*然后将参数s 字符串的内容复制到该内存地址,然后把该地址返回。
*该地址最后需要利用free()来释放。
*/
char * strdup(const char *ps);
在有些地方,C 和 C++用的是同一个 strdup 版本,所以函数内部使用 malloc分配内存。
调用 strdup函数之后,可能不知道必须对 strdup 返回的指针进行 free 操作。
为了防止这一情况,有些地方会专门为C++重写 strdup,并在函数内部调用了 new,这就要求其调用者记得最后用 delete。
这样就会导致严重的移植性问题,因为strdup函数内使用了malloc和new两种方式。
另外,C++程序员和 C 程序员一样对代码重用十分感兴趣。大家都知道,有大量的
基于 malloc 和 free 写成的代码构成的 C 库都非常值得重用。在 C++程序里使用 malloc
和 free没有错,只要保证用 malloc 得到的指针用 free,或者用 new 得到的指针最后
用 delete 来操作就可以了。
总结
既然 malloc 和 free 对构造函数和析构函数一无所知,把 malloc/free 和new/delete 混搭又无法预测,那么,就一心一意地使用 new 和 delete 吧。
猜你喜欢
- 2025-06-13 C++之类和对象(c++中类和对象的区别)
- 2025-06-13 C语言进阶教程:数据结构 - 哈希表的基本原理与实现
- 2025-06-13 C语言实现见缝插圆游戏!零基础代码思路+源码分享
- 2025-06-13 Windows 10下使用编译并使用openCV
- 2025-06-13 C语言进阶教程:栈和队列的实现与应用
- 2025-06-13 C语言这些常见标准文件该如何使用?很基础也很重要
- 2025-06-13 C语言 vs C++:谁才是编程界的“全能王者”?
- 2025-06-13 C语言无锁编程指南(c语言锁机代码)
- 2025-06-13 什么时候用C而不用C++?(c语言中什么时候用char)
- 2025-06-13 C++中使用new申请内存来实现动态数组
- 06-13C++之类和对象(c++中类和对象的区别)
- 06-13C语言进阶教程:数据结构 - 哈希表的基本原理与实现
- 06-13C语言实现见缝插圆游戏!零基础代码思路+源码分享
- 06-13Windows 10下使用编译并使用openCV
- 06-13C语言进阶教程:栈和队列的实现与应用
- 06-13C语言这些常见标准文件该如何使用?很基础也很重要
- 06-13C语言 vs C++:谁才是编程界的“全能王者”?
- 06-13C语言无锁编程指南(c语言锁机代码)
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)