当前位置:编程学习 > C/C++ >>

more-effective-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的一些东西。
补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,