防止内存泄露

看过<<C++编程思想:卷2>>,里面有一个防止内存泄露的例子:
如果一个类A的构造函数中,有需要动态分配内存的数据,那么就使用一个单独的类P来封装这些指针数据,因为不这样做的话,如果A的构造函数发生异常的话,那些已经分配了内存的对象将无法被回收。倘若我们使用P来把这些数据封装起来,不论A发生异常与否,P的析构函数都会被执行,它将释放封装在它内部的指针数据的内存。

这可以用商人的思想来理解:比如做水果生意的商人,他们并不关心农民是如何生产水果的,他们只关心市场上是否有他们所要的产品。如果市场上没有他们所要的产品,那么农民那里肯定是有异常了,可能遇洪水了,可能遇虫害了,等等。可能你会说,市场上也许本来就没有这个产品呢,你说我会不会怀疑那个商人是不是一个合格的商人呢?呵呵。所以,农民将承担起生产水果的责任。

我们假设水果商的目标是:5吨苹果,6吨香蕉。可是农民并没有生产出这么多的水果,而在他的目标日记上已经记录下这一数据,那他就有必要把这一个数据擦除掉。我们可以定义一个农民的类,它负责把释放水果资源。~~~表达能力太差了。。~~写个程序出来吧:


#include <iostream>
using namespace std;

typedef int TApple;
typedef char TTomato;

//////////////////////////////////////////////////
//
// class Farmer
class Farmer
{
public:
 Farmer( TApple a, TTomato t );
 ~Farmer( );

private:
 TApple * _applePtr;
 TTomato * _tomatoPtr;
};

Farmer::Farmer( TApple a, TTomato t )
{
 _applePtr = new TApple( a );
 _tomatoPtr = new TTomato( t );
}

Farmer::~Farmer( )
{
 if ( !_applePtr )
  delete _applePtr;
 if ( !_tomatoPtr )
  delete _tomatoPtr;

 cout << "Farmer is the best!" << endl;
}

/////////////////////////////////////////////////////
//
// enum ERisk
enum ERisk
{
 eNone,
 eFlood,
 ePest,
 eOther
};

/////////////////////////////////////////////////////////////
//
// class Trader
class Trader
{
public:
 Trader( TApple a, TTomato t, ERisk r = eNone );

private:
 Farmer _farmer;
};

Trader::Trader( TApple a, TTomato t, ERisk r ) : _farmer( a, t )
{
 // I will throw
 switch ( r )
 {
 case eNone:
  cout << "Good! The I have reached my target!" << std::endl;
  break;

 case eFlood:
  throw "Flood occured! I cannot do this business...\n";
  break;

 case ePest:
  throw "Fuck! I hate the pest just like the wet weather.\n";
  break;

 case eOther:
  throw "My God! I have never encountered this environment!\n";
  break;

 default:
  break;
 }
}

///////////////////////////////////////////
//
// main class
int main( )
{
 try
 {
  Trader t1( 5, 6 );
 }
 catch ( char* e_string )
 {
  cout << e_string << endl;
 }

 try
 {
  Trader t2( 5, 6, eFlood);
 }
 catch ( char* e_string )
 {
  cout << e_string << endl;
 }

 try
 {
  Trader t3( 5, 6, ePest );
 }
 catch ( char* e_string )
 {
  cout << e_string << endl;
 }

 try
 {
  Trader t4( 5, 6, eOther );
 }
 catch ( char* e_string )
 {
  cout << e_string << endl;
 }

 return 0;
}

无语,这里好像不能上传图片~~~~老提示silverlight错误~~~

原文地址:https://www.cnblogs.com/lin1270/p/1532693.html