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

在串口通信中使用共享指针(`std::shared_ptr`)

在串口通信中使用共享指针(std::shared_ptr)可以有效管理资源生命周期,避免内存泄漏和悬挂指针问题。以下是关键步骤和注意事项:


1. 管理串口对象生命周期

  • 创建共享指针:使用 std::make_shared 初始化串口对象,确保资源自动管理。

    #include <boost/asio.hpp>
    #include <memory>auto port = std::make_shared<boost::asio::serial_port>(io_context);
    port->open("/dev/ttyUSB0");
    
  • 绑定到异步操作:在异步读写中捕获 shared_ptr,确保回调执行期间对象存活。

    port->async_read_some(boost::asio::buffer(data),[port, data](const boost::system::error_code& ec, size_t bytes) {if (!ec) {// 处理数据,port 对象保持有效}});
    

2. 管理缓冲区

  • 动态缓冲区:使用 shared_ptr 包裹数据缓冲区,避免异步操作未完成时数据被释放。
    auto buffer = std::make_shared<std::vector<char>>(1024);
    port->async_write_some(boost::asio::buffer(*buffer),[buffer, port](const boost::system::error_code& ec, size_t bytes) {// 写入完成前,buffer 保持有效});
    

3. 避免循环引用

  • 使用 weak_ptr:若回调中需要访问父对象,使用 std::weak_ptr 打破循环引用。
    class SerialHandler {
    public:void start_read() {auto self = weak_from_this(); // C++17 的 weak_from_thisport_->async_read_some(/* ... */,[self](/* ... */) {if (auto ptr = self.lock()) {ptr->handle_read(ec, bytes);}});}
    private:std::shared_ptr<boost::asio::serial_port> port_;
    };
    

4. 自定义删除器

  • 释放资源:某些库需手动关闭串口,通过自定义删除器确保正确释放。
    auto deleter = [](boost::asio::serial_port* port) {if (port->is_open()) port->close();delete port;
    };
    std::shared_ptr<boost::asio::serial_port> port(new boost::asio::serial_port(io_context), deleter);
    

5. 线程安全与性能

  • 原子性操作shared_ptr 的引用计数是线程安全的,但对象内部仍需同步。
    std::mutex mtx;
    port->async_read_some(/* ... */,[port, &mtx](/* ... */) {std::lock_guard<std::mutex> lock(mtx);// 安全访问共享资源});
    
  • 性能权衡:高频通信中,shared_ptr 的原子操作可能影响性能,可考虑对象池或静态分配。

6. 示例:完整异步读写

#include <boost/asio.hpp>
#include <memory>class SerialPort {
public:SerialPort(boost::asio::io_context& io, const std::string& device): port_(std::make_shared<boost::asio::serial_port>(io, device)) {}void start_async_read() {auto buffer = std::make_shared<std::vector<char>>(128);port_->async_read_some(boost::asio::buffer(*buffer),[this, buffer](const boost::system::error_code& ec, size_t bytes) {if (!ec) {process_data(*buffer, bytes);start_async_read(); // 持续读取}});}private:std::shared_ptr<boost::asio::serial_port> port_;void process_data(const std::vector<char>& data, size_t size) { /* ... */ }
};

注意事项

  • 资源释放:确保所有异步操作完成后,shared_ptr 的引用计数归零,避免内存泄漏。
  • 超时处理:长时间未响应的操作需设置超时,防止对象因回调未触发而无法释放。
  • 异常处理:在异步操作中捕获异常,确保 shared_ptr 能正常析构。

通过合理使用 shared_ptr,可以简化串口通信中的资源管理,提升代码健壮性。

http://www.xdnf.cn/news/35281.html

相关文章:

  • 【HDFS入门】HDFS数据冗余与容错机制解析:如何保障大数据高可靠存储?
  • Ubuntu Linux 中文输入法默认使用英文标点
  • 深入理解FreeRTOS操作系统:计数型信号量的原理与应用
  • JavaWeb 课堂笔记 —— 13 MySQL 事务
  • 2000-2017年各省城市天然气供气总量数据
  • Ubuntu 25.04 “Plucky Puffin” 正式发布
  • 多线程和线程同步
  • 非接触式水位传感器详解(STM32)
  • office软件中word里面的编号库和列表库功能
  • 06-libVLC的视频播放器:推流RTMP
  • 第三届世界科学智能大赛新能源赛道:新能源发电功率预测-数据处理心得体会1
  • Java @Serial 注解深度解析
  • day46——两数之和-输入有序数组(LeetCode-167)
  • 人工智能在智慧农业中的应用:从田间到餐桌的变革
  • 【Vue】布局解析
  • Manus技术架构、实现内幕及分布式智能体项目实战 线上高级实训班
  • 洛谷的几道题
  • 某局部三层休闲娱乐中心建筑设计与结构设计
  • 19-算法打卡-哈希表-四数相加II-leetcode(454)-第十九天
  • @EnableAsync+@Async源码学习笔记之五
  • 第十届团体程序设计天梯赛-上理赛点随笔
  • 学习笔记: Mach-O 文件
  • Datawhale AI春训营 世界科学智能大赛--合成生物赛道:蛋白质固有无序区域预测 小白经验总结
  • 【信息系统项目管理师】高分论文:论信息系统项目的风险管理(钢铁企业生产计划管理系统)
  • 支持中文对齐的命令行表格打印python库——tableprint
  • cesium中postProcessStages全面解析
  • 13.第二阶段x64游戏实战-分析人物等级和升级经验
  • JNI 学习
  • Linux基础IO(九)之软链接
  • 洛谷P3373线段树详解【模板】