在我的方法中,创建了一个 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 许可协议
安全 吗?只有当您可以 保证 创建该对象的堆栈只有在
shared_ptr
是伪拥有它之后才会结束。可能 吗?当然:通过
shared_ptr
的构造函数一个什么都不做的删除器对象:当最后的
shared_ptr
被销毁时,会调用deleter,不会删除任何东西。好吗?并不真地。如上所述,在此类代码中不能普遍保证安全性。根据您的代码结构,这可能是合法的。但这需要非常小心。
这个
SomeClass
期望获得资源的所有权;这就是为什么它采用shared_ptr
。你通过传递一个shared_ptr
来欺骗它,它并不真正拥有它引用的对象。这意味着您和您的代码结构有责任不违反您对SomeClass
的承诺,即它将共享控制该对象的生命周期。