网站如何有排名国家企业信息公示网查询官网
2026/1/30 23:57:56 网站建设 项目流程
网站如何有排名,国家企业信息公示网查询官网,发任务做任务得网站,华为网站建设方案模板下载RAII 详解 什么是 RAII Resource Acquisition Is Initialization#xff08;资源获取即初始化#xff09; 核心思想#xff1a;把资源的生命周期绑定到对象的生命周期 构造函数获取资源析构函数释放资源对象销毁时#xff0c;资源自动释放FileHandler 示例 没有 RAII 的写法…RAII 详解什么是 RAIIResource Acquisition Is Initialization资源获取即初始化核心思想把资源的生命周期绑定到对象的生命周期构造函数获取资源析构函数释放资源对象销毁时资源自动释放FileHandler 示例没有 RAII 的写法voidprocess(){FILE*ffopen(data.txt,r);if(some_error){return;// 忘记 fclose文件泄漏}do_something();// 如果抛异常也泄漏fclose(f);}问题每个退出路径都要手动关闭文件容易遗漏。RAII 版本// file_handler.hpp#pragmaonce#includecstdio#includestdexcept#includestringclassFileHandler{FILE*fp;public:// 构造时打开文件获取资源FileHandler(constchar*path,constchar*mode):fp(fopen(path,mode)){if(!fp){throwstd::runtime_error(Cannot open file: std::string(path));}}// 析构时关闭文件释放资源~FileHandler(){if(fp){fclose(fp);}}// 禁止拷贝避免双重关闭FileHandler(constFileHandler)delete;FileHandleroperator(constFileHandler)delete;// 允许移动FileHandler(FileHandlerother)noexcept:fp(other.fp){other.fpnullptr;}FileHandleroperator(FileHandlerother)noexcept{if(this!other){if(fp)fclose(fp);fpother.fp;other.fpnullptr;}return*this;}// 使用文件FILE*get()const{returnfp;}size_tread(void*buf,size_t size){returnfread(buf,1,size,fp);}size_twrite(constvoid*buf,size_t size){returnfwrite(buf,1,size,fp);}};使用方式#includefile_handler.hpp#includeiostreamvoidprocess(){FileHandlerfile(data.txt,r);// 打开文件if(some_error){return;// 自动关闭}do_something();// 异常也自动关闭charbuf[1024];file.read(buf,sizeof(buf));}// 离开作用域自动关闭intmain(){try{FileHandlerf1(input.txt,r);FileHandlerf2(output.txt,w);charbuf[4096];size_t n;while((nf1.read(buf,sizeof(buf)))0){f2.write(buf,n);}}catch(conststd::exceptione){std::cerre.what()\n;// f1, f2 已经自动关闭了}}Stack Only 版本强制 FileHandler 只能在栈上创建确保 RAII 生效// file_handler_stack.hpp#pragmaonce#includecstdio#includestdexceptclassFileHandler{FILE*fp;public:FileHandler(constchar*path,constchar*mode):fp(fopen(path,mode)){if(!fp)throwstd::runtime_error(Cannot open file);}~FileHandler(){if(fp)fclose(fp);}// 禁止拷贝FileHandler(constFileHandler)delete;FileHandleroperator(constFileHandler)delete;// 禁止堆分配强制栈上使用void*operatornew(size_t)delete;void*operatornew[](size_t)delete;FILE*get()const{returnfp;}};使用voidprocess(){FileHandlerfile(data.txt,r);// ✓ 栈上自动管理// FileHandler* p new FileHandler(); // ✗ 编译错误}为什么要 Stack Only防止这种情况voidbad(){FileHandler*pnewFileHandler(data.txt,r);// 忘记 delete p文件永远不会关闭}Heap Only 版本有时需要共享文件句柄使用引用计数// file_handler_heap.hpp#pragmaonce#includecstdio#includememory#includestdexceptclassFileHandler{FILE*fp;// 私有构造/析构只能通过 create() 创建FileHandler(constchar*path,constchar*mode):fp(fopen(path,mode)){if(!fp)throwstd::runtime_error(Cannot open file);}~FileHandler(){if(fp)fclose(fp);}public:// 工厂方法返回 shared_ptrstaticstd::shared_ptrFileHandlercreate(constchar*path,constchar*mode){autopnewFileHandler(path,mode);// lambda 在成员函数内可以访问私有析构returnstd::shared_ptrFileHandler(p,[](FileHandler*f){deletef;});}FILE*get()const{returnfp;}};使用voidprocess(){// FileHandler f(data.txt, r); // ✗ 编译错误autofileFileHandler::create(data.txt,r);// ✓autofile2file;// 共享所有权引用计数 2// 传给其他函数/线程async_read(file);}// 引用计数归零时自动关闭三种方式对比┌─────────────────┬──────────────────┬──────────────────┬──────────────────┐ │ │ 普通 RAII │ Stack Only │ Heap Only │ ├─────────────────┼──────────────────┼──────────────────┼──────────────────┤ │ 栈上创建 │ ✓ │ ✓ │ ✗ │ ├─────────────────┼──────────────────┼──────────────────┼──────────────────┤ │ 堆上创建 │ ✓ │ ✗ │ ✓ │ ├─────────────────┼──────────────────┼──────────────────┼──────────────────┤ │ 生命周期 │ 作用域或手动 │ 作用域 │ 引用计数 │ ├─────────────────┼──────────────────┼──────────────────┼──────────────────┤ │ 共享所有权 │ 需要 shared_ptr │ ✗ │ ✓ (内置) │ ├─────────────────┼──────────────────┼──────────────────┼──────────────────┤ │ 适用场景 │ 通用 │ 局部资源管理 │ 跨作用域/线程共享 │ └─────────────────┴──────────────────┴──────────────────┴──────────────────┘总结┌────────────────────────────────────────────────────────┐ │ RAII 核心 │ ├────────────────────────────────────────────────────────┤ │ │ │ 构造 获取资源 │ │ 析构 释放资源 │ │ 对象死亡 资源释放 │ │ │ ├────────────────────────────────────────────────────────┤ │ 好处 │ ├────────────────────────────────────────────────────────┤ │ │ │ • 不会忘记释放 │ │ • 异常安全 │ │ • 代码简洁 │ │ │ ├────────────────────────────────────────────────────────┤ │ 选择指南 │ ├────────────────────────────────────────────────────────┤ │ │ │ 局部使用 → Stack Only │ │ 需要共享 → Heap Only shared_ptr │ │ 不确定 → 普通 RAII │ │ │ └────────────────────────────────────────────────────────┘

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询