zoukankan      html  css  js  c++  java
  • 防止内存泄露

    看过<<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错误~~~

  • 相关阅读:
    C# WPF – 利用“Attached Property” 把 RoutedEvent 接上 ICommand
    文件输入输出代码
    strcpy()
    heaplog
    单链表范例
    贪吃蛇
    时钟程序
    herizai_CD2所做答案
    6月25日代码
    6月24日代码
  • 原文地址:https://www.cnblogs.com/lin1270/p/1532693.html
Copyright © 2011-2022 走看看