相关疑难解决方法(0)

weak_ptr如何工作?

我理解如何使用weak_ptrshared_ptr.我shared_ptr通过计算其对象中的引用数来理解它是如何工作的.weak_ptr工作怎么样?我尝试阅读boost源代码,并且我不熟悉boost以了解它使用的所有内容.

谢谢.

c++ boost weak-references tr1 weak-ptr

57
推荐指数
1
解决办法
2万
查看次数

使用make_shared创建shared_ptr是否有任何缺点

使用make_shared<T>()而不是使用是否有任何缺点shared_ptr<T>(new T).

提升文档状态

用户一再请求工厂函数创建给定类型的对象并向其返回shared_ptr.除了方便和风格之外,这样的函数也是异常安全且相当快的,因为它可以对对象及其相应的控制块使用单个分配,从而消除了shared_ptr的构造开销的很大一部分.这消除了关于shared_ptr的主要效率投诉之一.

c++ boost shared-ptr

51
推荐指数
5
解决办法
1万
查看次数

如果我碰巧注意到它已过期,我应该在weak_ptr上调用reset吗?

我有一组Creature对象,使用std::make_shared和创建并拥有在我的应用程序的一部分中std::shared_ptr.

我还跟踪一个选择的零个或一个CreatureWorld使用对象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.

我的问题:

  1. GetSelection在这种情况下哪个版本被认为是最佳做法?

  2. 如果在模板化代码中发生类似的事情,那么答案是否会改变,哪些sizeof(T)是未知的并且可能是巨大的?或者在C++ 14中std::make_shared<T[]> …

c++ shared-ptr weak-ptr

10
推荐指数
1
解决办法
1463
查看次数

标签 统计

c++ ×3

boost ×2

shared-ptr ×2

weak-ptr ×2

tr1 ×1

weak-references ×1