C++中的RAII全称是“Resource acquisition is initialization”,直译为“资源获取就是初始化”。其实是一种gc类,利用类的构造函数和析构函数来保证资源获取后的正确释放,防止内存泄露。
网上找了个例子很好的说明这个用法:
void Func() { FILE *fp; char* filename = "test.txt"; if((fp=fopen(filename,"r"))==NULL) { printf("not open"); exit(0); } ... // 如果 在使用fp指针时产生异常 并退出 // 那么 fp文件就没有正常关闭fclose(fp);
}
而使用RAII,则是如下的方式:
class FileRAII{ public: FileRAII(FILE* aFile):file_(aFile){} ~FileRAII() { fclose(file_); }//在析构函数中进行文件关闭 FILE* get() {return file_;} private: FILE* file_; };void Func()
{
FILE fp;
char filename = "test.txt";
if((fp=fopen(filename,"r"))==NULL)
{
printf("not open");
exit(0);
}
FileRAII fileRAII(fp);
... // 如果 在使用 fp 指针时产生异常 并退出
// 那么 fileRAII 在栈展开过程中会被自动释放,析构函数也就会自动地将 fp 关闭// 即使所有代码是都正确执行了,也无需手动释放 fp,fileRAII 它的生命期在此结束时,它的析构函数会自动执行!
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于