当前位置: 首页 > news >正文

“调用销毁者置于末尾”原则

核心思想:
在一个对象的方法中,如果需要调用一个可能导致该对象自身被销毁的回调或函数,那么这个调用必须是该方法中的最后一个操作。之后不应再有任何访问对象成员(this 指针)的代码。

问题场景:
在事件驱动和异步编程中,一个对象(如 TcpConnection)的方法(如 handleClose)经常需要调用一个由其所有者(如 TcpServer)设置的回调(如 closeCallback_)。这个回调的职责通常是释放对该对象的最后一个 shared_ptr,从而触发对象的析构。

把它想象成一个特工执行任务的场景:

  • 对象:特工。
  • 方法 handleClose():特工执行的“终极任务”。
  • 回调 closeCallback_:任务中的一个步骤是“按下自毁按钮”。
  • 原则:“按下自毁按钮”必须是特工在任务清单上的最后一项。如果他按下按钮后还想去喝杯咖啡(执行后续代码),那么他就会和基地一起被炸飞。

危险的写法:

void MyObject::doSomethingAndDie() {// ...potentiallySuicidalCallback_(); // 这个回调可能会 delete this;// 危险!如果对象已被销毁,这里的代码会访问无效内存。this->member_ = 10; LOG_INFO << "Task finished.";
}
void MyObject::doSomethingAndDie() {// ...// 为了确保在函数内部 this 有效,可以先创建一个临时的 shared_ptrstd::shared_ptr<MyObject> guardThis = shared_from_this(); // 执行所有其他操作...// 将可能导致自毁的调用放在绝对的最后。potentiallySuicidalCallback_(guardThis);
}

http://www.dtcms.com/a/550147.html

相关文章:

  • GRPO相关优化论文
  • Openvins学习---ov_msckf中的State.h
  • 有什么网站可以做数学题项目建设全过程
  • 德庆网站建设良精企业网站管理系统
  • dz网站自己做的模板放在哪里小说网站建设的支柱
  • idea中Docker一键自动化部署
  • faster-whisper热词详解与程序设计
  • 电子电力技术的控制电路学习分享1
  • 原生JS实现虚拟列表:从基础到性能优化的完整实践
  • 万全网站建设Myeclipse怎么做网站
  • C#: Contains 方法
  • .NET 泛型编程(泛型类、泛型方法、泛型接口、泛型委托、泛型约束)
  • 网站建设研究方法建筑图纸字母代表大全图解
  • PocketBase轻量级后端解决方案
  • 【JavaWeb|day19 Web后端进阶 SpringAOP、SpringBoot原理、自定义Starter、Maven高级】
  • 织梦可以放两个网站网站内容架构
  • ENSP Pro Lab笔记:配置STP/RSTP/MSTP(4)
  • 关于公司网站建设阿里巴巴logo高清图
  • Appium使用指南与自动化测试案例详解
  • 做网站的实践报告四川网站建设seo优化
  • 农村智慧养老:探索新时代养老新路径
  • vim上手
  • 在线课程软件网站建设费用济南网站建设的费用
  • 做全景网站live writer wordpress
  • 网站后台使用说明试用网站建设
  • 工作汇报和技术分享PPT如何高效制作?我的实用经验
  • Nginx基础入门-web模块
  • 从零开始的云原生之旅(七):ConfigMap 和 Secret 配置管理
  • 潍坊企业网站设计怎么注册一个自己的品牌
  • 展示网站欣赏wordpress 官网