c++ RAII 其实是个挺头疼问题。c++11lamda来了问题迎刃而解。
举个例子:
void f()
{
HANDLE f1 = openFile("a.txt");
if(!f1) return ;
HANDLE f2 = openFile("b.txt");
if(!f2){
CloseHandle(f1);
return ;
}
pass
CloseHandle(f1);
CloseHandle(f2);
}
百密一疏总有时候少了个CloseHandle。然后句柄泄漏,blablabla,procexp查看句柄,windbg hook,看代码找代码。
当然你可以try finally,可惜不是我的菜.
c++11 来了。
class cf
{
cf(std::function<void()> f):f_(f){}
~cf(){
f_();
}
std::function<void()> f_;
}
void f()
{
HANDLE f1 = openFile("a.txt");
HANDLE f2 = openFile("b.txt");
cf cf_([&](){
if(f1){
CloseHandle(f1);
}
if(f2){
CloseHandle(f2);
}
});
pass
}
管他内存、句柄、自定义资源等等全ok