c++ - 创建 shared_ptr 到堆栈对象

标签 c++ c++11 shared-ptr smart-pointers

在我的方法中,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/

相关文章:

c++ - 模板类与模板成员类

c++ - 为什么 ofstream::flush() 返回 ostream?

c++ - && 声明的变量

c++ - 构造函数采用 shared_ptr

c++ - 如何正确关闭使用 asio 进行事件排队的类实例

c++ - 如何提取 char* 的子部分

c++ - 测试抛出失败的函数

java - C++0x - lambda 表达式看起来与 Java 的匿名内部类一样吗?

c++ - std::make_unique<T> 与重置(新 T)

c++ - 使用shared_ptr而不是unique_ptr作为类成员只是为了避免隐式复制构造函数删除是否明智?