我理解如何使用weak_ptr和shared_ptr.我shared_ptr通过计算其对象中的引用数来理解它是如何工作的.weak_ptr工作怎么样?我尝试阅读boost源代码,并且我不熟悉boost以了解它使用的所有内容.
谢谢.
使用make_shared<T>()而不是使用是否有任何缺点shared_ptr<T>(new T).
提升文档状态
用户一再请求工厂函数创建给定类型的对象并向其返回shared_ptr.除了方便和风格之外,这样的函数也是异常安全且相当快的,因为它可以对对象及其相应的控制块使用单个分配,从而消除了shared_ptr的构造开销的很大一部分.这消除了关于shared_ptr的主要效率投诉之一.
我有一组Creature对象,使用std::make_shared和创建并拥有在我的应用程序的一部分中std::shared_ptr.
我还跟踪一个选择的零个或一个Creature在World使用对象std::weak_ptr<Creature>.
void World::SetSelection(const std::shared_ptr<Creature>& creature) {
selection = creature;
}
std::shared_ptr<Creature> World::GetSelection() const {
return selection.lock();
}
Run Code Online (Sandbox Code Playgroud)
调用者GetSelection负责检查指针是否为空.如果是,那意味着目前没有选择.
这一切都完全符合我的喜好:当选定Creature的自然原因(应用程序中的其他地方)死亡时,再次GetSelection开始返回nullptr,就像没有选择任何东西一样.
但是在这种情况下,World::selection成员仍然指向std::shared_ptr控制块.这可能非常大,因为我std::make_shared用来创建我的Creature对象(我意识到Creature对象在正确的时间被正确销毁但仍然分配了它的内存).我正在考虑GetSelection改为:
std::shared_ptr<Creature> World::GetSelection() {
const auto ret = selection.lock();
if (!ret)
selection.reset();
return ret;
}
Run Code Online (Sandbox Code Playgroud)
一旦我注意到它不再需要,它就会释放内存.令人讨厌的是,这个版本GetSelection不可能const.
GetSelection在这种情况下哪个版本被认为是最佳做法?
如果在模板化代码中发生类似的事情,那么答案是否会改变,哪些sizeof(T)是未知的并且可能是巨大的?或者在C++ 14中std::make_shared<T[]> …