std::shared_ptr通过引用计数机制自动管理内存,每个实例共享一个控制块,内含强弱引用计数、对象指针、自定义删除器等,确保对象在无拥有者时自动析构;循环引用需用std::weak_ptr打破;std::make_shared提升性能与异常安全。

std::shared_ptr
shared_ptr
shared_ptr
shared_ptr
shared_ptr
shared_ptr
在我看来,
std::shared_ptr
new
delete
它的核心工作原理可以这样理解:每个
std::shared_ptr
当一个
shared_ptr
shared_ptr
shared_ptr
立即学习“C++免费学习笔记(深入)”;
反之,当一个
shared_ptr
reset()
关键点来了:一旦这个强引用计数降到零,
std::shared_ptr
std::weak_ptr
这种机制有效地避免了手动内存管理中常见的“忘记
delete
delete
std::shared_ptr
说到
shared_ptr
shared_ptr
通常,一个控制块至少会包含以下几个核心元素:
强引用计数(Strong Reference Count):这就是我们一直在说的,有多少个
std::shared_ptr
shared_ptr
shared_ptr
shared_ptr
弱引用计数(Weak Reference Count):这个是为
std::weak_ptr
weak_ptr
weak_ptr
指向被管理对象的原始指针:控制块需要知道它到底管理的是哪个对象。这个指针就是指向我们用
new
make_shared
自定义删除器(Custom Deleter):这是一个可选但非常强大的特性。有时,我们管理的资源不是通过
new
malloc
shared_ptr
shared_ptr
delete
shared_ptr
自定义分配器(Custom Allocator):同样是可选的,用于在创建对象或控制块时使用特定的内存分配策略。这在某些高性能或内存受限的场景下会很有用。
所以,控制块远不止一个计数器。它是一个包含了所有必要信息和回调的枢纽,确保了对象生命周期的正确管理,并提供了高度的灵活性。
std::shared_ptr
这是一个非常经典的问题,也是
shared_ptr
std::shared_ptr
shared_ptr
shared_ptr
shared_ptr
shared_ptr
这就像两个人都握着对方的手,谁都不肯先松开,结果就是谁也走不了。
那么,我们怎么解决呢?答案是引入
std::weak_ptr
weak_ptr
weak_ptr
shared_ptr
weak_ptr
weak_ptr::lock()
shared_ptr
lock()
shared_ptr
shared_ptr
所以,解决循环引用的策略就是:在构成循环引用的两个对象中,让其中一个指针变成
std::weak_ptr
举个例子,假设我们有
Parent
Child
Parent
shared_ptr<Child>
Child
Parent
Child
shared_ptr<Parent>
Parent
Child
shared_ptr<Child>
Child
Parent
weak_ptr<Parent>
Child
Parent
Parent
Parent
shared_ptr
Parent
Parent
Child
所以,
std::shared_ptr
std::weak_ptr
std::make_shared
new
shared_ptr
这其实是我在日常开发中,几乎总是推荐使用
std::make_shared
当你这样做时:
std::shared_ptr<MyClass> ptr(new MyClass());
这里发生了两次独立的内存分配:
new MyClass()
MyClass
std::shared_ptr<MyClass>(...)
shared_ptr
而当你使用
std::make_shared
auto ptr = std::make_shared<MyClass>();
这里通常只发生一次内存分配。
std::make_shared
MyClass
shared_ptr
这种“一次分配”带来的优势是多方面的:
shared_ptr
some_function(std::shared_ptr<MyClass>(new MyClass()), another_function());
new MyClass()
another_function()
std::shared_ptr<MyClass>(...)
new MyClass()
std::shared_ptr
another_function()
new
MyClass
shared_ptr
std::make_shared
some_function(std::make_shared<MyClass>(), another_function());
std::make_shared
shared_ptr
another_function()
make_shared
所以,除非你有非常特殊的需求(比如需要自定义删除器来处理非
new
std::make_shared
以上就是C++的std::shared_ptr是如何通过引用计数来管理内存的的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号