gpt4 book ai didi

c++ - 在这种情况下我应该使用 unique_ptr 还是 shared_ptr?

转载 作者:可可西里 更新时间:2023-11-01 15:02:18 24 4
gpt4 key购买 nike

在我的 QT 应用程序的主窗口中,我使用 std::shared_ptr 来保存指向我的网络服务实例的指针,该实例管理与多个客户端的所有连接。现在,我必须将这个指针传递给多个子窗口,以便它们可以与客户端通信。

我最好在主窗口和子窗口中使用 std::shared_ptr 成员变量并在创建子窗口时传递复制它,还是使用 std 更好: :unique_ptr 并将原始指针传递给子窗口,因为主窗口无论如何都会比子窗口长寿?

非常感谢!

最佳答案

主要的实际区别是当主窗口被销毁而子窗口仍然存在并正在使用网络服务时会发生什么:

  • 如果您使用 unique_ptr 并传递原始指针,则会出现未定义的行为。
  • 如果您使用 shared_ptr,则网络服务会一直存在,直到所有子窗口都被销毁。

现在,如果这种情况在设计上是不可能的,那么未定义的行为本身就不是问题。如果这种情况由于错误而发生,那么它可能会帮助您检测错误,如果网络服务与主窗口一起被破坏,如果您使用 unique_ptr 就会发生这种情况>。使用 unique_ptr 表示主窗口是唯一拥有网络服务的东西,其他人只是按照主窗口的指示使用它。

另一方面,如果您以后更改设计并希望使条件合法,或者如果您希望以不同的方式使用子窗口,这意味着没有一个网络服务对象可以全部使用并且比它们长所有,那么如果你从一开始就使用 shared_ptr 会更容易。使用shared_ptr表示所有窗口共享网络服务的所有权。

我认为不可能笼统地说您是否应该尝试让您的代码在面对“不可能的条件”时继续工作。在这种情况下,这样做的成本非常低(shared_ptr 比原始指针的复制成本更高,当然,但与创建子窗口相比成本低,并且代码的结构相同)。在某些情况下灵活地使“不可能的条件”发生是很有用的,例如在对子窗口代码进行单元测试时。所以可能使用 shared_ptr 来获得灵 active 。如果出于其他原因强制执行生命周期约束是一件大事,那么您可能不想要任何灵 active ,在这种情况下,请避免编写只会隐藏错误的代码。

关于c++ - 在这种情况下我应该使用 unique_ptr 还是 shared_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21848763/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com