标准::shared_ptr、标准::weak_ptr和控制块
std::shared_ptr, std::weak_ptr and control block
我最近一直在阅读有关std::make_shared
函数的信息。据我从书Effective Modern C++
了解,应该首选make函数,除非:
- 自定义内存管理已到位。
- 存在内存问题,例如
std::weak_ptr
可能超过其std::shared_ptr
,处理大型对象,自定义删除器等。
因此,我理解std::make_shared
只需一次调用即可在堆及其控制块上分配一个对象。因此,问题是std::shared_ptr
的对象可能不会被删除,直到必须释放控制块。如果我错了,请纠正我,但这是发布最后一个std::weak_ptr
的时候。因此,如果有一个活std::weak_ptr
指向它,std::make_shared
可能不合适。
但对于大多数对象来说,这仍然是一个问题吗?我们是否需要关心何时释放非大型对象的控制块?可以说,现在内存并不难获得,所以这是否只是大型对象和低内存系统的问题?
我关心的一点是:如果我设计了一个使用 std::make_shared
的类,并且将来使用std::weak_ptr
,我必须返回并用常规std::shared_ptr<Class>(new Class())
替换 make 函数。
这是一个很小的边缘问题,被吹得不成比例。这是问题的唯一情况是,如果对象很大(相对于可用内存(,大小是对象的基本大小(不是析构函数(对象或其任何成员(可以释放的内存(,并且弱指针可能会明显超过对象的寿命。这是一种罕见的病例组合,几乎从不重要。
相关文章:
- 使用CMake检测支持的C++标准
- 如何理解C++标准N3337中的expr.const.cast子句8
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 编译标准库类型
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- CLANG 编译器 说:变量"PTR"可能未初始化
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 铸造标准::有没有回到原来的类型
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 标准库类型的赋值运算符的引用限定符
- 标准是否严格定义了该程序应该如何编译?
- 如何从Windows应用程序输出到标准?
- 安全到标准:移动会员?
- 如何正确将字符串转换为标准::时间::system_clock::time_point?
- 这是否符合C++标准:双响双响,例如!!(-0.0).
- 标准::变体的赋值运算符
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?