this指针转化为智能指针的正确方式

在C++类内部的非静态成员函数内部,是不能将this指针强制转化成shared_ptr,这样的行为是非常危险的,因为this指针是普通指针,而将普通指针强制转化成智能指针是非常非常非常危险的,有可能导致内存被意外释放。

在class内部,获得this指针的shared_ptr,需要class继承std::enable_shared_from_this,示例代码如下:

#include <memory>
#include <iostream>

class SharedTest :public std::enable_shared_from_this<SharedTest>
{
  public:
    SharedTest(int v) : std::enable_shared_from_this<SharedTest>(),
                        val(v)
    {
        std::cout << "SharedTest,val = " << val << std::endl;
    }

    void SelfShared()
    {
        auto self_ptr = shared_from_this();
        std::cout << "SelfShared, val = " << val << ", use_count = " << self_ptr.use_count() << std::endl;
    }

    ~SharedTest()
    {
        std::cout << "~SharedTest,val = " << val << std::endl;
    }

    int val = 0;
};

int main()
{
    auto tt = std::make_shared<SharedTest>(123);
    tt->SelfShared();
    return 0;
}

输出结果如下:

SharedTest,val = 123
SelfShared, val = 123, use_count = 2
~SharedTest,val = 123

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

9 + 4 =

− 3 = 1