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所管理对象的裸指针。
核心问题总结
- 当两个线程需要访问并更新同一资源时,是否必须使用
shared_ptr? - 若某个类不需要获取共享对象的所有权,该如何在私有成员中安全存储这个共享对象?
内容的提问来源于stack exchange,提问作者gfree
相关产品推荐
相关产品推荐

