c ++创建shared_ptr到堆栈对象

Sve*_*art 11 c++ smart-pointers shared-ptr c++11

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

Player player(fullName,age);
Run Code Online (Sandbox Code Playgroud)

我的老师给了我们一段带有构造函数的代码,该构造函数将shared_ptr带到了一个玩家对象.

//constructor of the class
SomeClass(const std::shared_ptr<Socket> client, std::shared_ptr<Player> player)
Run Code Online (Sandbox Code Playgroud)

让我们说我们想要调用SomeClass的构造函数并传递我们在堆栈上创建的玩家对象.

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

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

为什么我不确定结果:

如果创建stackobject的范围结束但仍然使用shared_ptr,反之亦然.

stackobject在超出范围时会被删除,或者它是否仍然存活,因为仍然存在对该对象的引用(尽管在另一个类中)?

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

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

shared_ptr<Player> player{ new Player {fullName,age} };
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 21

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

安全吗?只有当你可以保证创建该对象的堆栈只会在shared_ptr伪拥有它的所有伪造之后结束.

有可能?当然:传递给shared_ptr构造函数一个什么都不做的删除对象:

auto sptr = shared_ptr<Player>(&player, [](Player *) {});
Run Code Online (Sandbox Code Playgroud)

当最后一个shared_ptr被销毁时,将调用删除器并且不会删除任何内容.

?并不是的.如上所述,在这种代码中,安全性不是普遍保证的.根据您的代码结构,这可能是合法的.但它需要非常小心.

SomeClass是预期要求点资源的所有权; 这就是为什么它需要一个shared_ptr.通过传递它shared_ptr并不真正拥有它引用的对象,你有点撒谎.这意味着您和您的代码结构的责任在于不违反您SomeClass对该对象的生命周期共享控制权的承诺.


Pet*_*ker 6

共享指针的目的是管理动态创建的对象的生命周期。只要有指向一个对象的共享指针,那个对象就一定存在;当指向一个对象的最后一个共享指针被销毁时,该对象将被销毁。

堆栈对象有一个根本不同的生命周期:它们存在直到代码退出它们创建的范围,然后它们被销毁。

生命周期的两个概念是不兼容的:共享指针无法确保超出范围的堆栈对象仍然存在。

所以不要把两者混为一谈。


Sem*_*mel 5

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

我同意@Nicolas Bolas 的观点,它不安全。但是从堆栈对象的副本创建 shared_ptr 可能是安全的

shared_ptr<Player> playerPtr(new Player(player));
Run Code Online (Sandbox Code Playgroud)

当然,如果 Player 是可复制的。