跳到正文

第5章学习笔记:资源、所有权与RAII

课程笔记

通过逐步可编译的程序掌握资源、所有权与RAII,从现象走到语言规则、资源状态和工程证据。

关联:章节 第5章 资源、所有权与RAII

第5章笔记:资源、所有权与RAII

本章问题

通过逐步可编译的程序掌握资源、所有权与RAII,从现象走到语言规则、资源状态和工程证据。 七课组成一条从可编译现象到语言规则、对象状态和工程验证的链,不能拆成互不相干的语法点。

七课连接

  • 自动、动态与静态存储期:规则 storage duration bounds lifetime;实验任务为写一个能编译运行的最小程序展示“自动、动态与静态存储期”,记录输入、关键对象状态、输出和编译命令,并用规则 storage duration bounds lifetime 解释结果;严格边界为不得把“自动、动态与静态存储期”只写成语法模板;必须说明类型、所有权/生存期、失败输入、复杂度或并发可见性中与本节有关的边界;本节产物将作为《new/delete为什么难》的输入或约束。
  • new/delete为什么难:规则 allocation≠ownership;实验任务为写一个能编译运行的最小程序展示“new/delete为什么难”,记录输入、关键对象状态、输出和编译命令,并用规则 allocation≠ownership 解释结果;严格边界为不得把“new/delete为什么难”只写成语法模板;必须说明类型、所有权/生存期、失败输入、复杂度或并发可见性中与本节有关的边界;本节产物将作为《析构与RAII》的输入或约束。
  • 析构与RAII:规则 acquire in constructor; release in destructor;实验任务为写一个能编译运行的最小程序展示“析构与RAII”,记录输入、关键对象状态、输出和编译命令,并用规则 acquire in constructor; release in destructor 解释结果;严格边界为不得把“析构与RAII”只写成语法模板;必须说明类型、所有权/生存期、失败输入、复杂度或并发可见性中与本节有关的边界;本节产物将作为《拷贝构造和拷贝赋值》的输入或约束。
  • 拷贝构造和拷贝赋值:规则 copy duplicates declared value semantics;实验任务为写一个能编译运行的最小程序展示“拷贝构造和拷贝赋值”,记录输入、关键对象状态、输出和编译命令,并用规则 copy duplicates declared value semantics 解释结果;严格边界为不得把“拷贝构造和拷贝赋值”只写成语法模板;必须说明类型、所有权/生存期、失败输入、复杂度或并发可见性中与本节有关的边界;本节产物将作为《移动语义与右值引用》的输入或约束。
  • 移动语义与右值引用:规则 move transfers valid resources;实验任务为写一个能编译运行的最小程序展示“移动语义与右值引用”,记录输入、关键对象状态、输出和编译命令,并用规则 move transfers valid resources 解释结果;严格边界为不得把“移动语义与右值引用”只写成语法模板;必须说明类型、所有权/生存期、失败输入、复杂度或并发可见性中与本节有关的边界;本节产物将作为《智能指针与所有权图》的输入或约束。
  • 智能指针与所有权图:规则 unique/shared/weak model ownership;实验任务为写一个能编译运行的最小程序展示“智能指针与所有权图”,记录输入、关键对象状态、输出和编译命令,并用规则 unique/shared/weak model ownership 解释结果;严格边界为不得把“智能指针与所有权图”只写成语法模板;必须说明类型、所有权/生存期、失败输入、复杂度或并发可见性中与本节有关的边界;本节产物将作为《资源安全实验》的输入或约束。
  • 资源安全实验:规则 every acquired resource has one release path;实验任务为写一个能编译运行的最小程序展示“资源安全实验”,记录输入、关键对象状态、输出和编译命令,并用规则 every acquired resource has one release path 解释结果;严格边界为不得把“资源安全实验”只写成语法模板;必须说明类型、所有权/生存期、失败输入、复杂度或并发可见性中与本节有关的边界;本节产物将作为《从不变量设计类》的输入或约束。

实验闭环

从空目录建立在线兼容的C++17程序,开启警告,运行本章两道代码题各四组测试,再新增一个失败用例。C++20扩展另作显式比较。保存编译命令、输入、输出、首个诊断和修复后的回归。涉及资源就画所有权,涉及容器就标迭代器有效性,涉及并发就画happens-before。

复盘

错题不能只记“粗心”。标记它属于阶段、类型、控制、对象生存期、所有权、异常、复杂度还是并发。更换输入与实现重做阶段卷;能解释规则为何阻止错误,并能展示反例,才算迁移成功。