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
对该对象的生命周期共享控制权的承诺.
共享指针的目的是管理动态创建的对象的生命周期。只要有指向一个对象的共享指针,那个对象就一定存在;当指向一个对象的最后一个共享指针被销毁时,该对象将被销毁。
堆栈对象有一个根本不同的生命周期:它们存在直到代码退出它们创建的范围,然后它们被销毁。
生命周期的两个概念是不兼容的:共享指针无法确保超出范围的堆栈对象仍然存在。
所以不要把两者混为一谈。
从堆栈对象创建 shared_ptr 是否安全/可能/好?
我同意@Nicolas Bolas 的观点,它不安全。但是从堆栈对象的副本创建 shared_ptr 可能是安全的
shared_ptr<Player> playerPtr(new Player(player));
Run Code Online (Sandbox Code Playgroud)
当然,如果 Player 是可复制的。
归档时间: |
|
查看次数: |
6163 次 |
最近记录: |