程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> more-effective-c++ 序列 異常

more-effective-c++ 序列 異常

編輯:C++入門知識

  思想: 局部對象管理資源,當中途調用出現異常的時候,利用局部對象的析構函數必須被調用的策略,在析構函數中做釋放資源的操作。 一個局部對象存放[必須自動歸還的資源],利用對象的析構函數歸還資源。auto_ptr, scoped_ptr, auto_lock, FilePtr, HandlePtr 都是這樣的思想。 這個是示例代碼。 [cpp]  #include   #include   #include   using namespace std;      /*  作者:lpstudy  日期:2013-3-16  內容:more effective C++異常一章第9節,利用局部對象析構函數釋放資源,保證出現異常的時候資源被安全釋放。  */   #define TRACE_FUCTION_AND_LINE(fmt, ...) printf("[%20s:%4d]"fmt"\n",__FUNCTION__, __LINE__, ##__VA_ARGS__)      //Widget僅僅是一個簡單的測試類,作為auto_ptr模板的實例化參數。auto_ptr來管理new的Widget內存,並負責delete   class Widget   {   public:       Widget(int nHight = 0): m_nHight(nHight) {TRACE_FUCTION_AND_LINE();}       ~Widget(){TRACE_FUCTION_AND_LINE();}       void Log () {TRACE_FUCTION_AND_LINE("My Log------%d", m_nHight);}       int m_nHight;   };      //FilePtr接收一個FILE handle,並負責在對象析構的時候關閉handle。   class FilePtr   {   public:       explicit FilePtr(FILE* f = NULL):m_hFile(f)       {           TRACE_FUCTION_AND_LINE("m_hFile:%08p", m_hFile);       }       ~FilePtr()        {           if (m_hFile)            {               TRACE_FUCTION_AND_LINE("close m_hFile:%08p", m_hFile);               fclose(m_hFile);            }       }       FILE* Get() {return m_hFile;}   private:       FILE* m_hFile;   };         int main()   {       TRACE_FUCTION_AND_LINE("Trace auto_ptr.......");       auto_ptr autoWight(new Widget(100));       autoWight->Log();          TRACE_FUCTION_AND_LINE("Trace FilePtr.......");       FilePtr filePtr(fopen("data.txt", "a+"));       char buf[100] = "Data Test ...\n";       fwrite(buf, 1, strlen(buf), filePtr.Get());       return 0;   }     希望還沒有獲取這種思想,或者知道這種思想但還沒有完全領悟的,仔細看看這個簡單的例子。 如果想更深入的理解關於auto_ptr以及lock的一些東西,建議看看前面我博客前面介紹的scoped_ptr以及autolock的一些東西。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved