shared_ptr的概念和一些特性调查

shared_ptr

概念

shared_ptr 是 C++11 中引入的一种智能指针,用于自动管理资源,特别是动态分配的内存。它属于 头文件中定义的智能指针类之一,用于解决动态内存分配中的内存泄漏和资源生命周期管理问题。shared_ptr 通过引用计数机制来实现多个 shared_ptr 实例共享同一资源。

具有较好的安全性,可以避免内存泄漏和悬挂指针问题。

特性

线程安全的说明

shared_ptr 自身的引用计数是线程安全的,但指向的对象本身不是线程安全的。如果多个线程需要访问同一对象,需要额外的同步机制。

二进制兼容性

如果客户代码里有 new Bar,那么肯定不安全,因为 new 的字节数不够装下新 Bar。相反,如果 library 通过 factory 返回 Bar* (并通过 factory 来销毁对象)或者直接返回 shared_ptr,客户端不需要用到 sizeof(Bar),那么可能是安全的。
即把创建交给动态库,而不是由客户自己创建。

陈硕博客

shared_ptr的析构函数可以调用基类的没有设置为virtual的析构函数

#include <iostream>
#include <memory>

class base
{
public:
    base()
    {
        std::cout << "base constructor" << std::endl;
    }
    ~base()
    {
        std::cout << "base destructor" << std::endl;
    }
};

class test: public base
{
public:
    test(): base()
    {
        std::cout << "test constructor" << std::endl;
    }
    ~test()
    {
        std::cout << "test destructor" << std::endl;
    }
};


int main()
{
    std::cout << "test shared_ptr------------" << std::endl;
    {
        std::shared_ptr<base> ptr(new test);
    }

    std::cout << "test unique_ptr------------" << std::endl;
    {
        std::unique_ptr<base> ptr(new test);
    }
    return 0; // success
}

输出结果是:

test shared_ptr------------
base constructor
test constructor
test destructor
base destructor
test unique_ptr------------
base constructor
test constructor
base destructor

可以发现shared_ptr可以在析构时自动释放资源没有设置基类为虚析构函数的基类,而unique_ptr不行。

查阅源码调查原因发现:
shared_ptr中,会判断是否存在基类
并且创建一个指向基类的指针:
mutable __weak_ptr<_Tp, _Lp> _M_weak_this;

当析构的时候会一并调用_M_weak_this的析构函数,也就是基类的析构函数.

shared_ptr能实现这一点主要在于:
shard_ptr构造的时候,会去判断指针的类型,并结合shared_ptr的模板参数

unique_ptr之所以实现不了这种特性,是因为unique_ptr默认采用的是default_delete,而default_delete的模板参数是由unique_ptr的模板参数决定的。所以导致其不能实现。

但unique_ptr的优点就是可以灵活的更换delete函数。

热门相关:奥罗拉公主   宠物男友   一次性事务17   机器魔偶   婶婶我更好