尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

UE进阶之路-6

UE进阶之路-6 E09 RAII E10 手动内存管理从自动释放到手动配对日期2026-08-27学习章节01 C 语言基础摘要今天完成 E09 RAII 文件读写与 E10 手动 new/delete 练习理解了资源自动释放与手动配对的区别并通过 FileGuard 的异常测试代码验证了栈展开时析构自动执行。今日进度E09-1 到 E09-4FileGuard、异常安全、禁止拷贝E10-1new/delete 标量E10-2故意不 delete观察内存泄漏E10-3new[]/delete[] 配对E10-4改用智能指针一、RAII 与 FileGuardRAII 的意思是“资源获取即初始化”构造函数获取资源析构函数释放资源。无论正常退出还是异常析构都会执行资源不会漏释放。FileGuard 测试代码classFileGuard{public:explicitFileGuard(conststd::stringpath):File(path){}~FileGuard(){if(File.is_open()){File.close();}}std::ofstreamStream(){returnFile;}private:std::ofstream File;};异常安全测试try{FileGuardfile_guard(test.txt);file_guard.Stream()written via FileGuardstd::endl;throwstd::runtime_error(simulate failure while holding file);}catch(conststd::exceptione){std::cerrcaught: e.what()std::endl;}输出顺序FileGuard closed automatically caught: simulate failure while holding file关键点throw后先发生栈展开局部对象file_guard在进入catch之前析构所以“自动关闭”出现在“caught”前面。二、堆与栈回顾栈是局部变量的区域进入函数分配、离开函数自动释放堆是动态分配区域生命周期由代码控制。intvalue42;// value 在栈上int*pnewint(42);// p 在栈上p 指向的 int 在堆上三、new/delete 配对规则new-deletenew[]-delete[]delete arr;对new[]数组是未定义行为。对int数组可能碰巧不崩因为元素没有析构、底层分配器相似但换成有析构的类型就会泄漏或崩溃。int*arrnewint[5];delete[]arr;// 必须 delete[]四、智能指针与 make_uniquestd::unique_ptrintpstd::make_uniqueint(42);推荐用make_unique而不是把裸new包进智能指针UseResource(std::unique_ptrA(newA),GetValue());参数求值顺序不固定如果GetValue()先抛异常new A的内存就泄漏了。make_unique内部一次完成分配和包装没有裸指针悬空窗口。五、代码片段intscalar42;int*pScalarnewint(scalar);deletepScalar;int*arrnewint[5];delete[]arr;std::unique_ptrintsmartstd::make_uniqueint(42);六、踩坑与收获delete和delete[]不能混用。“碰巧没崩”不等于“正确”未定义行为不能依赖。手动内存管理的核心是“谁分配谁释放”RAII 和智能指针让这条规则自动成立。明日计划E11 unique_ptr唯一所有权、移动、容器、工厂函数
返回列表