Gemery

导航

在作用域结束时自动执行某个函数

假设有这样一个函数,这个函数里有多个if分支,每个if分支里都有return;
如果在这个函数return之前,我们需要销毁某个对象,
那么我们需要在每个if分支里面添加销毁这个对象的代码。
如果我们合理的利用对象的生命周期,那么我们就可以在对象析构时做一些事情,比如调用某个外界函数。

为了实现这一点我编写了一个类:CDestructorRunner

头文件:DestructorRunner.h

/**************************************************************************
file: DestructorRunner.h
class: CDestructorRunner

析构函数运行器:当CDestructorRunner对象生命周期结束时,它的析构函数调用它在初始化
时被指定的回调函数

remark:

CDestructorRunner提供4种方式的类重载.
1. 生命周期结束时,调用某个对象的成员函数(函数带一个参数)
2. 生命周期结束时,调用某个对象的成员函数(函数无参数)
3. 生命周期结束时,调用某个普通函数(函数带一个参数)
4. 生命周期结束时,调用某个普通函数(函数无参数)

date: 2011-5-18
writer: guoxuxing

mail: gemeryguo@126.com
**************************************************************************
*/

#pragma once

template
<class TClass,typename TResult,typename TParam>
class CDestructorRunner
{
// 析构时,调用某个对象的函数(函数具备一个参数)
public:
typedef TResult (TClass::
*Function)(TParam);

CDestructorRunner(Function callback,TParam param,TClass
*pClassObj):
m_callback(callback),m_pClassObj(pClassObj),m_param(param)
{

}
~CDestructorRunner()
{
(m_pClassObj
->*m_callback)(m_param);
}

Function m_callback;
TClass
*m_pClassObj;
TParam m_param;
};
template
<class TClass,typename TResult>
class CDestructorRunner<TClass,TResult,void>
{
// 析构时,调用某个对象的函数(函数无参数)
public:
typedef TResult (TClass::
*Function)(void);

CDestructorRunner(Function callback,TClass
*pClassObj):
m_callback(callback),m_pClassObj(pClassObj)
{

}
~CDestructorRunner()
{
(m_pClassObj
->*m_callback)();
}

Function m_callback;
TClass
*m_pClassObj;
};

template
<typename TResult,typename TParam>
class CDestructorRunner<void,TResult,TParam>
{
// 析构时,调用一个普通函数
public:
typedef TResult(
*Function)(TParam);
CDestructorRunner(Function callback,TParam param):
m_callback(callback),m_param(param)
{

}
~CDestructorRunner()
{
(m_callback)(m_param);
}

Function m_callback;
TParam m_param;
};

template
<typename TResult>
class CDestructorRunner<void,TResult,void>
{
// 析构时,调用一个普通函数
public:
typedef TResult(
*Function)(void);
CDestructorRunner(Function callback):
m_callback(callback)
{

}
~CDestructorRunner()
{
(m_callback)();
}

Function m_callback;
};

测试例子:调用Func

void Delete(int *pA)
{
delete pA;
}
void Func()
{
int *p = new int(10);

// 自定释放函数为:Delete, p指向的内存会自动释放
CDestructorRunner<void,void,int*> drDelInt(Delete,p);

if (*p==1)
{
//delete p;
return;
}
if (*p==2)
{
//delete p;
return;
}
if (*p==3)
{
//delete p;
return;
}
if (*p==4)
{
//delete p;
return;
}
if (*p==5)
{
//delete p;
return;
}
if (*p==6)
{
//delete p;
return;
}
if (*p==10)
{
//delete p;
return;
}
}

使用 CDestructorRunner类可以省去很多代码的书写,也不至于在某个分支里面忘记释放内存并造成内存泄露.

使用时,也可以为CDestructorRunner指定某个类的成员函数,需要这个类的某个对象指针。

 

void EmptyStr(CString& str)
{
// str被清空了
CDestructorRunner<CString,void,void> drEmptyString(CString::Empty,&str);
}

posted on 2011-05-20 18:09  Gemery  阅读(499)  评论(0编辑  收藏  举报