在我的QT应用程序的主窗口中,我使用一个 std::shared_ptr
来持有指向我的网络服务实例的指针,该服务管理所有与多个客户端的连接。现在,我必须将此指针传递给多个子窗口,以便它们可以与客户端通信。
我应该在主窗口和子窗口中使用一个 std::shared_ptr
成员变量,并在创建子窗口时传递其副本,还是使用一个 std::unique_ptr
并向子窗口传递原始指针,因为主窗口无论如何都将比子窗口存在时间更久?
非常感谢!
在我的QT应用程序的主窗口中,我使用一个 std::shared_ptr
来持有指向我的网络服务实例的指针,该服务管理所有与多个客户端的连接。现在,我必须将此指针传递给多个子窗口,以便它们可以与客户端通信。
我应该在主窗口和子窗口中使用一个 std::shared_ptr
成员变量,并在创建子窗口时传递其副本,还是使用一个 std::unique_ptr
并向子窗口传递原始指针,因为主窗口无论如何都将比子窗口存在时间更久?
非常感谢!
shared_ptr
的引用计数并销毁它,对吗?我问这个问题是因为有一个潜在有用的第二个断言可以做到,即当子窗口销毁其shared_ptr
时,它不是最后一个所有者。当然,您可以只断言不是unique()
,然后销毁。 - Steve Jessopstd::shared_ptr
还是 std::unique_ptr
的问题,主要取决于所有权。对象是否一次只有一个所有者?还是对象将有多个所有者?std::shared_ptr
是正确的选择。
不要 使用 std::unique_ptr
,然后传递原始封装指针。当您忘记它并且 std::unique_ptr
对象超出范围时,仍然有人可以访问原始指针,这会给您带来麻烦。main
中创建局部变量。不管怎样,首先要问自己的是该对象应该具有什么寿命期。如果寿命期对应于main
(或任何其他函数)的作用域,则应选择局部变量。如果该对象应该与主窗口的生命周期相对应,则主窗口的成员变量应该是适当的解决方案。所有这些都取决于应用程序如何指定对象的生命周期(这是一个设计问题,不能通过低级编程技术来解决)。std::unique_ptr
可能是一个好的解决方案,因为如果没有移动,则它精确地模拟了作用域变量的生命周期。(我对std::shared_ptr
非常怀疑;寿命应该是确定性的,而不依赖于是否有人持有指向它的指针。我也可以想象出网络服务器将保存其客户端的指针的情况,存在循环依赖的风险。)main()
中的局部变量呢?我曾经考虑过将服务设置为“单例”,但是我不想这样做,尽管我不记得原因了。 - user66875