在C/C++编码中,open对close,new对delete,malloc对free等等是严格要求的,否则会有各种泄露的奇葩情况。
但是实际编码中,各种异常捕捉和错误判断又让编码变得繁琐臃肿。
后来在使用golang中,defer方法使用非常方便,C++虽然没有自带的,但是可以写嘛!
借助C++类的析构方法和lambada表达式,还有std::function容器,很容易写出来一个自己的defer(以下代码是复制来的,感觉非常的干练,自己写的不好看不贴了,后来也用了这个.h)
C++的类生存期一般是在自己所在的{}里面,退出大括号时会触发析构,通过lambada表达式将要最后执行的代码写进去,然后函数执行结束的时候触发,完美。
使用示例,非常的方便,与golang几乎一致
FILE *p = fopen("a.txt","r"); defer(if (p) fclose(p);); HANDLE hFile = CreateFile(xxx); defer(CloseHandle(hFile)); //...
单独.h文件,引用即可使用
defer.h
#pragma once #include <functional> class DeferHelper { public: DeferHelper(std::function<void()> &&cb) : cb_(std::move(cb)) {} ~DeferHelper() { if (cb_) cb_(); } private: std::function<void()> cb_; }; #define CONNECTION(text1,text2) text1##text2 #define CONNECT(text1,text2) CONNECTION(text1,text2) #define defer(code) DeferHelper CONNECT(L,__LINE__) ([&](){code;})