创建 shared_ptr 到堆栈对象

新手上路,请多包涵

在我的方法中,创建了一个 Player 对象,如下所示:

 Player player(fullName,age);

我的老师给了我们一段代码,其中包含一个将 shared_ptr 传递给玩家对象的构造函数。

 //constructor of the class
SomeClass(const std::shared_ptr<Socket> client, std::shared_ptr<Player> player)

假设我们要调用 SomeClass 的构造函数并传递我们在堆栈上创建的播放器对象。

从堆栈对象创建 shared_ptr 是否安全/可能/良好?

为了让这个问题更容易理解,假设我们有两个大代码项目,我们想要合并它们,以便从另一个项目调用一个项目的方法,我们应该重写所有文件以使用 shared_ptr 还是专门堆栈对象(对于那些需要连接)或者我们应该只为堆栈对象创建一个 shared_ptr 。

为什么我不确定结果:

如果创建堆栈对象的范围结束但仍使用 shared_ptr 怎么办,反之亦然。

堆栈对象在超出范围时被删除,还是因为仍然存在对该对象的引用(尽管在另一个类中)而保持活动状态?

shared_ptr 超出范围并尝试删除该对象,即使 stackobject 正在引用它也可以吗?

注意:我知道我可以使用以下内容并通过播放器

shared_ptr<Player> player{ new Player {fullName,age} };

原文由 Sven van den Boogaart 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 685
2 个回答

从堆栈对象创建 smart_ptr 是否安全/可能/良好?

安全 吗?只有当您可以 保证 创建该对象的堆栈只有在 shared_ptr 是伪拥有它之后才会结束。

可能 吗?当然:通过 shared_ptr 的构造函数一个什么都不做的删除器对象:

 auto sptr = shared_ptr<Player>(&player, [](Player *) {});

当最后的 shared_ptr 被销毁时,会调用deleter,不会删除任何东西。

好吗?并不真地。如上所述,在此类代码中不能普遍保证安全性。根据您的代码结构,这可能是合法的。但这需要非常小心。

这个 SomeClass 期望获得资源的所有权;这就是为什么它采用 shared_ptr 。你通过传递一个 shared_ptr 来欺骗它,它并不真正拥有它引用的对象。这意味着您和您的代码结构有责任不违反您对 SomeClass 的承诺,即它将共享控制该对象的生命周期。

原文由 Nicol Bolas 发布,翻译遵循 CC BY-SA 3.0 许可协议

创建指向堆栈对象的共享指针是不安全的,因为堆栈对象在其包含的函数返回后立即销毁。本地对象被隐式和自动地分配和释放,尝试干预肯定会调用多种未定义的行为。

原文由 alter_igel 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题