嵌入式 C++ 接口为什么常追问虚析构和对象切片?
经基类指针删除派生对象时,基类析构函数必须满足多态删除要求,通常声明 virtual;按值传递派生对象给基类会发生切片,派生状态和动态行为丢失。资源受限系统还应评估 vtable、间接调用和所有权。
Question Bank
按知识、方向与难度筛选;每道题都有分层回答和工程追问。
经基类指针删除派生对象时,基类析构函数必须满足多态删除要求,通常声明 virtual;按值传递派生对象给基类会发生切片,派生状态和动态行为丢失。资源受限系统还应评估 vtable、间接调用和所有权。
不能只凭习惯决定。要评估工具链 ABI、代码体积、最坏路径、异常表、第三方库和故障策略;关闭异常后必须用 expected、状态码或构造后校验建立一致错误模型,关闭 RTTI 后也不能再依赖 dynamic_cast/typeid。
引用捕获可能在回调执行时指向已经离开作用域的局部对象,捕获 `this` 也不延长实例寿命;值捕获会复制当时状态。异步接口应明确回调寿命,使用稳定上下文、取消同步或受控弱引用。
弱定义在没有强定义时提供默认实现,常用于启动文件中断别名和库 Hook。最终选择发生在链接阶段,必须用符号表和 map 文件确认;同名强符号、静态库提取规则和 LTO 都可能让覆盖结果偏离预期。
map 适合看链接输入、地址和内存占用;nm 看符号定义与绑定;objdump 可反汇编和查看段内容;readelf 直接解析 ELF 头、Section、Program Header、重定位与 DWARF。组合使用能确认符号来自哪里、最终放到哪里。
C 允许为遍历和差值计算构造数组末尾后一位指针,但该位置不属于数组对象,不能解引用。指针算术必须留在同一数组对象及其末尾后一位范围内,跨对象比较或越界构造不能当作通用地址数学。
`int *a[4]` 中 `[]` 先与 a 结合,所以 a 是含四个整型指针的数组;`int (*p)[4]` 用括号让 `*` 先结合,所以 p 指向含四个 int 的数组。下标步长和 sizeof 因此不同。