shared_ptr的控制块包含强引用计数、弱引用计数、删除器、分配器和类型擦除信息,独立于被管理对象存储,确保生命周期管理分离,支持多所有权与weak_ptr安全访问,避免循环引用问题。使用make_shared时对象与控制块连续分配,提升性能但可能延长内存占用;直接构造则分离分配,灵活性高但开销大。

shared_ptr
shared_ptr
make_shared
make_shared
当我们谈论C++
shared_ptr
shared_ptr
为什么是独立的控制块呢?想象一下,如果引用计数直接放在对象内部,那当对象被销毁时,我们怎么知道还有没有
weak_ptr
shared_ptr
shared_ptr
shared_ptr
shared_ptr
weak_ptr
weak_ptr
weak_count
weak_ptr
shared_ptr
这个控制块的生命周期,是独立于被管理对象的。它会一直存在,直到强引用计数和弱引用计数都降为零。这意味着即使对象已经被销毁,只要还有
weak_ptr
weak_ptr
shared_ptr
立即学习“C++免费学习笔记(深入)”;
shared_ptr
shared_ptr
强引用计数(use_count)无疑是最显眼的,它直接决定了被管理对象的生命周期。每当一个
shared_ptr
shared_ptr
shared_ptr
紧随其后的是弱引用计数(weak_count)。这个计数器管理着
weak_ptr
weak_ptr
weak_count
weak_count
控制块内部还存储着一个删除器(deleter)。这其实是一个可调用对象,负责在强引用计数为零时,执行被管理对象的实际销毁操作。这个特性非常强大,它允许我们对对象的销毁方式进行自定义。比如,如果你
shared_ptr
new[]
delete[]
delete
shared_ptr
如果
shared_ptr
shared_ptr
这个问题,其实触及了
shared_ptr
shared_ptr
shared_ptr
最直接的挑战是生命周期管理的分离。
shared_ptr
weak_ptr
weak_ptr
weak_ptr
lock()
weak_ptr
weak_ptr
多所有权模型的实现会变得异常复杂。
shared_ptr
shared_ptr
shared_ptr
类型擦除和自定义删除器的灵活性也会受到限制。
shared_ptr
shared_ptr
shared_ptr
shared_ptr
所以,将引用计数和相关管理信息放在一个独立的控制块中,是
shared_ptr
shared_ptr
shared_ptr
第一种,也是我个人非常推崇的,是使用std::make_shared
shared_ptr
make_shared
shared_ptr
new
然而,
make_shared
weak_ptr
weak_ptr
weak_ptr
第二种分配方式,是当你直接从裸指针构造shared_ptr
std::shared_ptr<MyObject> ptr(new MyObject());
MyObject
new MyObject()
shared_ptr
这种方式的缺点也很明显:
但它也有其应用场景,比如当你需要管理一个已经存在的对象,或者一个不是通过
new
shared_ptr
总的来说,在绝大多数情况下,我强烈建议优先使用
std::make_shared
以上就是C++ shared_ptr控制块 引用计数存储位置的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号