You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++:存储共享对象但不获取所有权的实现方案问询

硬件共享对象的所有权与存储方式问题

场景说明

某硬件同一时间仅允许一个连接,因此所有使用该硬件的模块必须引用同一个Hardware对象。相关类定义如下:

Hardware 类定义

class Hardware {
public:
   void Open(); // 此方法会创建并启动后台连接监视器
   void Close();
   std::string SendPing();
   std::string AskForSomeOtherData();
   bool isConnected();
   bool setConnected(bool connState);
private:
   bool connected_;
   int hndl_;
};

ConnectionMonitor 类定义

后台运行的ConnectionMonitor类负责监控连接状态,连接断开时通知UI:

class ConnectionMonitor{
public:
    ConnectionMonitor(Hardware& hw);
    void Run(); // 启动后台线程向设备发送“ping”确认在线状态,更新Hardware.connected_
private:
    Hardware hw_; // 可选存储类型:Hardware* hw_、shared_ptr<Hardware> hw_ 或 Hardware& hw_;
};

疑问点

  • 更新私有数据是否等同于拥有所有权?
    我认为不是,因为修改私有成员不会影响对象的生命周期,但不确定这个判断是否正确。

  • 共享对象的私有成员存储方式选择
    传入shared_ptr是可行方案,但我不想获取对象的所有权;使用引用似乎更贴合需求,但有资料提到“类私有成员使用引用并不妥当”,对此存疑。

  • 指针存储的安全性
    若调用方以shared_ptr持有Hardware对象,通过ConnectionMonitor(*hardware)传入后,在ConnectionMonitor内部存储指向该对象的指针是否安全?示例代码如下(核心是存储指针而非创建副本):

    ConnectionMonitor(Hardware& hw){
       Hardware* ptr = &hw; // 存储指向传入对象的指针
    }
    

    这相当于创建了一个指向shared_ptr所管理对象的裸指针。

核心问题总结

  1. 当两个线程需要访问并更新同一资源时,是否必须使用shared_ptr?
  2. 若某个类不需要获取共享对象的所有权,该如何在私有成员中安全存储这个共享对象?

内容的提问来源于stack exchange,提问作者gfree

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 18:36:41