在我的方法中,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 仍在使用,反之亦然。
stackobject 在超出范围时被删除,还是因为仍然有对该对象的引用(尽管在另一个类中)而保持事件状态?
shared_ptr 超出范围并尝试删除该对象,即使堆栈对象正在引用它,它也可以吗?
注意:我知道我可以使用以下内容并传递播放器
shared_ptr<Player> player{ new Player {fullName,age} };
最佳答案
Is it ever safe/possible/good to create a smart_ptr from a stack object?
安全?仅当您可以保证创建该对象的堆栈仅在所有伪拥有它的shared_ptr
之后结束。
可能?当然:向 shared_ptr
的构造函数传递一个什么都不做的删除器对象:
auto sptr = shared_ptr<Player>(&player, [](Player *) {});
当最后一个 shared_ptr
被销毁时,将调用删除器,不会删除任何内容。
好?并不真地。如上所述,在此类代码中无法普遍保证安全。根据您的代码结构,这可能是合法的。但这需要非常小心。
此 SomeClass
期望声明资源的所有权;这就是它采用 shared_ptr
的原因。您向它传递一个并不真正拥有它引用的对象的 shared_ptr
是在欺骗它。这意味着您和您的代码结构有责任不违反您对 SomeClass
做出的 promise ,即它将共享控制该对象的生命周期。
关于c++ - 创建 shared_ptr 到堆栈对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38855343/