走进C++程序世界-----指针(动态申请空间和释放空间)(二)

2014-11-23 22:26:03 ? 作者: ? 浏览: 9
*a = (obj *)malloc(sizeof(obj)); // 申请动态内存
a->Initialize(); // 初始化
//…
a->Destroy(); // 清除工作
free(a); // 释放内存
}
void UseNewDelete(void)
{
Obj *a = new Obj; // 申请动态内存并且初始化
//…
delete a; // 清除并且释放内存
}
示例用malloc/free和new/delete如何实现对象的动态内存管理
类Obj的函数Initialize模拟了构造函数的功能,函数Destroy模拟了析构函数的功能。函数UseMallocFree中,由于malloc/free不能执行构造函数与析构函数,必须调用成员函数Initialize和Destroy来完成初始化与清除工作。函数UseNewDelete则简单得多。
所以我们不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。
既然new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局呢?这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。所以new/delete必须配对使用,malloc/free也一样。
二:new delete在实现上其实调用了malloc,free函数。
三:new operator除了分配内存,还要调用构造函数。
malloc函数只是负责分配内存。
×××××××××××××××××××××××××××××××××××以上是转载部分××××××××××××××××××××××××××
[cpp]
#include
/*C++ 内存分配、使用和删除指针*/
using namespace std;
int main()
{
int localVariable = 5;
int *pLocal = &localVariable;
/*申请空间*/
int *pHeap = new int;
*pHeap = 7;
cout << "localVariable:" << localVariable << endl;
cout << "*pLocal:" << *pLocal << endl;
cout << "*pHeap:" << *pHeap << endl;
/*释放空间*/
delete pHeap;
pHeap = new int;
*pHeap = 9;
cout << "pHeap: " << *pHeap << endl;
delete pHeap;
return 0;
}
输出
[cpp]
localVariable:5
*pLocal:5
*pHeap:7
pHeap: 9
程序中每个new 都应该有对应delete ,否则会造成内存泄露。
[cpp]
//using new and delete
#include
using namespace std;
class Simplecat{
public:
Simplecat();
~Simplecat();
private:
int itsAge;
};
Simplecat::Simplecat()
{
cout << "Constructor called ******" << endl;
itsAge = 1;
}
Simplecat::~Simplecat()
{
cout << "Destructor called." << endl;
}
int main()
{
cout << "Simplecat Frisky******start *****"<< endl;
Simplecat Frisky;
cout << "Simplecat Frisky******end******"<< endl;
cout <<"new Simplecat*******start******"<< endl;
Simplecat *ptags = new Simplecat;
delete ptags;
cout << "new Simplecat******end******"<
return 0;
}
[cpp]
Simplecat Frisky******start *****
Constructor called ******
Simplecat Frisky******end******
new Simplecat*******start******
Constructor called ******
Destructor called.
new Simplecat******end******
Destructor called.
[cpp]
-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: