“弱引用计数”用来保存当前正在指向此基础对象的weak_ptr指针的个数,weak_ptr会保持控制块的生命周期,因此有一种特殊情况是:强引用的引用计数已经降为0,没有shared_ptr再持有基础对象,然而由于仍有weak_ptr指向基础对象,弱引用的引用计数非0,原本因为强引用计数已经归0就可以释放的基础对象内存,现在变成了“强引用...
我们直接使用的shared_ptr定义在shared_ptr.h文件中,shared_ptr仅仅只是定义了些接口给我们使用,该类本身并没有执行任何操作,具体的内存管理以及引用计数相关的还需要关注它的父类__shared_ptr,shared_ptr定义如下: template<typename_Tp>classshared_ptr:public__shared_ptr<_Tp>{public:constexprshared_ptr()noexce...
当引用计数变为0时,shared_ptr会调用这个删除器来释放对象。这使得shared_ptr能够灵活地管理各种资源的释放。 cpp void customDeleter(int* p) { // 自定义的删除逻辑 delete p; } std::shared_ptr<int> ptr(new int(10), customDeleter); 弱引用功能:weak_ptr是一种与shared_ptr配合使用的智能...
在底层实现中,这个引用计数器保存在某个内部类型里(这个类型中还包含了deleter,它控制了指针的释放策略,默认情况下就是普通的delete操作),而这个内部类型对象在shared_ptr第一次构造时以指针的形式保存在shared_ptr中。shared_ptr重载了赋值运算符,在赋值和拷贝构造另一个shared_ptr时,这个指针被另一个shared_ptr共享。
现摘录一篇不错的讲Shared_ptr的文章,要点记录如下: 智能指针是为了管理针对于异常、线程间等的内存,防止发生内存泄漏而存在的 其基于引用计数来管理内存,每新增一个指向该对象的智能指针则引用计数加一,减少一个(如超过作用域等)则减少一个。当减少到零时会自动调用相应对象的析构函数释放内存。
main函数中,虽然用了两个智能指针shared_ptr,但是它们管理的都是同一个资源,资源的引用计数应该是2,为什么打印出来是1呢?导致出main函数把A对象析构了两次,不正确!如果你有这样的疑问,说明对于shared_ptr的底层原理还没有完全搞清楚。 代码清单2 #include<iostream>usingnamespacestd;// 智能指针测试类classA{publ...
强弱引用计数均归零即释放计数器内存。如果是make_shared出来的等所有引用计数归零一并释放。
unique_ptr和shared_ptr是C++智能指针家族中的两大支柱,它们各自适用于不同的场景。正确使用它们不仅能够有效避免内存泄漏,还能简化资源管理,提升代码的安全性和可维护性。通过了解它们的工作原理、识别常见问题和易错点,并采取相应的避免策略,开发者可以更加高效地利用智能指针的强大功能,构建高质量的C++应用程序。
每当创建一个新的 shared_ptr 对象时,该计数器就会加 1,当 shared_ptr 对象被销毁时,计数器就会减 1。当计数器的值变为 0 时,表示没有任何 shared_ptr 对象引用该对象,此时 shared_ptr 会自动释放该对象的内存。因此,当跟 shared_ptr 共享同一个对象的所有 shared_ptr 对象都被销毁时,shared_ptr 就会...