more-effective-c++シーケンス2異常(第9節、ローカルオブジェクト管理リソースの利用方法)のテスト例

2038 ワード

more effective c++異常という大節については、全体的な文章(まだ少し下に書く過程)があり、異常という大節の各小節の精髄を比較的短い文で説明しますが、大節全体は多くのテストに関連し、各テストには1つの文章があり、各小節に対応しています.この記事では,9節でローカルオブジェクト管理リソースをどのように利用するかについて述べる.
アイデア:
ローカルオブジェクトはリソースを管理し、途中呼び出しで異常が発生した場合、ローカルオブジェクトの構造関数が呼び出されなければならないポリシーを利用して、構造関数でリソースを解放する操作を行います.
ローカルオブジェクトは[自動的に返さなければならないリソース]を格納し、オブジェクトの構造関数を使用してリソースを返します.auto_ptr, scoped_ptr, auto_ロック、FilePtr、HandlePtrはこのような考えです.
これはサンプルコードです.
#include <iostream>
#include <time.h>
#include <memory>
using namespace std;

/*
  :lpstudy
  :2013-3-16
  :more effective C++     9 ,              ,                。
*/
#define TRACE_FUCTION_AND_LINE(fmt, ...) printf("[%20s:%4d]"fmt"
",__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<Widget> autoWight(new Widget(100)); autoWight->Log(); TRACE_FUCTION_AND_LINE("Trace FilePtr......."); FilePtr filePtr(fopen("data.txt", "a+")); char buf[100] = "Data Test ...
"; fwrite(buf, 1, strlen(buf), filePtr.Get()); return 0; }

まだこのような思想を得ていないことを望んで、あるいはこのような思想がまだ完全に悟っていないことを知っていて、この簡単な例をよく見てください.
もっと深く理解したいならauto_についてptrやlockのいくつかは、前のブログで紹介したscoped_を見ることをお勧めします.ptrとautolockのいくつかのもの.
私を信じてください.これはとても価値があります.Googleコードは大きなサイズで使用されています.