思想:
局部對象管理資源,當中途調用出現異常的時候,利用局部對象的析構函數必須被調用的策略,在析構函數中做釋放資源的操作。
一個局部對象存放[必須自動歸還的資源],利用對象的析構函數歸還資源。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的一些東西。