来自: color: #9a9a9a;">http://hi.baidu.com/sppeivan/blog/item/3041ca0e7c3d39206059f3ba.html
malloc与free是C++/Cclass="tags" href="/tags/YuYan.html" title=语言>语言的标准库函数c;new/class="tags" href="/tags/DELETE.html" title=delete>delete是C++的运算符。它们都可用于申请动态内存和释放内存。
对于非内部数据类型的对象而言c;光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数c;对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符c;不在class="tags" href="/tags/BianYiQi.html" title=编译器>编译器控制权限之内c;不能够把执行构造函数和析构函数的任务强加于malloc/free。
因此C++class="tags" href="/tags/YuYan.html" title=语言>语言需要一个能完成动态内存分配和初始化class="tags" href="/tags/GongZuo.html" title=工作>工作的运算符newc;以及一个能完成清理与释放内存class="tags" href="/tags/GongZuo.html" title=工作>工作的运算符class="tags" href="/tags/DELETE.html" title=delete>delete。注意new/class="tags" href="/tags/DELETE.html" title=delete>delete不是库函数。我们先看一看malloc/free和new/class="tags" href="/tags/DELETE.html" title=delete>delete如何实现对象的动态内存管理c;见示例6。
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(); // 清除class="tags" href="/tags/GongZuo.html" title=工作>工作
free(a); // 释放内存
}
void UseNewDelete(void)
{
Obj *a = new Obj; // 申请动态内存并且初始化
//…
class="tags" href="/tags/DELETE.html" title=delete>delete a; // 清除并且释放内存
}
示例6 用malloc/free和new/class="tags" href="/tags/DELETE.html" title=delete>delete如何实现对象的动态内存管理
类Obj的函数Initialize模拟了构造函数的功能c;函数Destroy模拟了析构函数的功能。函数UseMallocFree中c;由于malloc/free不能执行构造函数与析构函数c;必须调用成员函数Initialize和Destroy来完成初始化与清除class="tags" href="/tags/GongZuo.html" title=工作>工作。函数UseNewDelete则简单得多。
所以我们不要企图用malloc/free来完成动态对象的内存管理c;应该用new/class="tags" href="/tags/DELETE.html" title=delete>delete。由于内部数据类型的“对象”没有构造与析构的过程c;对它们而言malloc/free和new/class="tags" href="/tags/DELETE.html" title=delete>delete是等价的。
既然new/class="tags" href="/tags/DELETE.html" title=delete>delete的功能完全覆盖了malloc/freec;为什么C++不把malloc/free淘汰出局呢?这是因为C++程序经常要调用C函数c;而C程序只能用malloc/free管理动态内存。
如果用free释放“new创建的动态对象”c;那么该对象因无法执行析构函数而可能导致程序出错。如果用class="tags" href="/tags/DELETE.html" title=delete>delete释放“malloc申请的动态内存”c;理论上讲程序不会出错c;但是该程序的可读性很差。所以new/class="tags" href="/tags/DELETE.html" title=delete>delete必须配对使用c;malloc/free也一样。
color: #ff0000;">总之c;malloc/free和new/class="tags" href="/tags/DELETE.html" title=delete>delete不能交叉配对使用。