std :: shared_ptr,std :: weak_ptr和控制块

巴尔切夫

我最近一直在阅读有关std::make_shared功能的文章。据我了解Effective Modern C++,make函数应该是首选,除非:

  1. 自定义内存管理到位。
  2. 存在一些内存问题,例如std::weak_ptr可能会过期std::shared_ptr,处理大对象,自定义删除器等。

因此,我了解std::make_shared只需一个调用即可在堆及其控制块上分配一个对象。因此,问题是std::shared_ptr在必须释放控制块之前,可能无法删除对象。如果我错了,请纠正我,但这是最后一次std::weak_ptr发布的时间。因此,std::make_shared如果有一个活着的人可能并不适合std::weak_ptr

但这对于大多数对象仍然是一个问题吗?我们是否需要关心何时为非大对象释放控制块?可以说,如今的内存并不难获得,这是否仅对于大型对象和低内存系统而言才是问题所在?

我关心的问题是:如果我设计一个使用std::make_sharedstd::weak_ptr在将来使用的类,那么我必须返回并用一个regular替换make函数std::shared_ptr<Class>(new Class())

大卫·施瓦兹(David Schwartz)

这是一个微小的边缘问题,不合比例。唯一有问题的情况是,如果对象很大(相对于可用内存),则其大小是对象的基本大小(不是析构函数(对象或其任何成员)可以释放的内存) ),并且弱指针可能会大大延长对象的寿命。这是一种罕见的案例组合,几乎没有意义。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在信号处理程序中使用`std :: shared_ptr`和`std :: weak_ptr`是否安全?

来自分类Dev

QVariant与std :: shared_ptr

来自分类Dev

QVariant与std :: shared_ptr

来自分类Dev

std :: weak_ptr和对应的std :: shared_ptr之间是否存在任何数据争用?

来自分类Dev

使用std :: move与std :: shared_ptr

来自分类Dev

std :: bind和std :: weak_ptr

来自分类Dev

std :: shared_ptr和继承

来自分类Dev

std :: function和shared_ptr

来自分类Dev

std :: weak_ptr:锁定还是shared_ptr构造函数?

来自分类Dev

std :: shared_ptr深层复制对象

来自分类Dev

使用* this作为std :: shared_ptr

来自分类Dev

数据与memcpy的std :: shared_ptr分配

来自分类Dev

std :: shared_ptr预分配内存

来自分类Dev

std set of boost :: shared_ptr <string>

来自分类Dev

可重用的std :: shared_ptr

来自分类Dev

std :: shared_ptr深层复制对象

来自分类Dev

数据与memcpy的std :: shared_ptr分配

来自分类Dev

使用* this作为std :: shared_ptr

来自分类Dev

std :: shared_ptr初始化

来自分类Dev

如何访问std :: shared_ptr的内容?

来自分类Dev

std :: shared_ptr删除者类型

来自分类Dev

移动 std::shared_ptr 的函数声明

来自分类Dev

禁用 std::shared_ptr 的清理

来自分类Dev

拥有std :: make_shared的std :: shared_ptr

来自分类Dev

std :: enable_if和std :: shared_ptr

来自分类Dev

使用模板将std :: shared_ptr <Derived>上载到std :: shared_ptr <Base>

来自分类Dev

使用std shared_ptr作为std :: map键

来自分类Dev

使用std :: shared_ptr线程构建基块

来自分类Dev

使用std map和shared_ptr的奇怪内存行为