linux C++共享指针(std::shared_ptrstd::make_shared)共享对象,reset()重置共享指针,use_count()查看引用计数

Posted Dontla

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux C++共享指针(std::shared_ptrstd::make_shared)共享对象,reset()重置共享指针,use_count()查看引用计数相关的知识,希望对你有一定的参考价值。

文章目录

共享指针是一种智能指针,它提供了与 std::unique_ptr 相似的语法,但是它允许多个指针共享同一对象的所有权。
当不再需要该对象时,共享指针会自动计数,并在没有任何指针指向该对象时释放它。

示例

#include <memory>
#include <string>
#include <iostream>

int main()

    // 创建一个指向字符串的 shared_ptr
    std::shared_ptr<std::string> event = std::make_shared<std::string>("This is an event.");    //This is an event.
    std::cout << *event << std::endl;

    // 查看共享对象引用计数
    std::cout << "event.use_count() = " << event.use_count() << std::endl;                      //event.use_count() = 1

    // 多个 shared_ptr 可以指向同一个对象
    std::shared_ptr<std::string> event2 = event;
    std::cout << *event2 << std::endl;                                                          //This is an event.

    // 查看共享对象引用计数
    std::cout << "event.use_count() = " << event.use_count() << std::endl;                      //event.use_count() = 2
    std::cout << "event2.use_count() = " << event2.use_count() << std::endl;                    //event2.use_count() = 2


    // 对象只有当所有 shared_ptr 对它的引用都断开后,才会被销毁
    event.reset();
    // 查看共享对象引用计数
    std::cout << "event.use_count() = " << event.use_count() << std::endl;                      //event.use_count() = 0     //如果共享指针已被销毁,查看其引用计数,不会报错,值为0,有点奇怪(下同)
    std::cout << "event2.use_count() = " << event2.use_count() << std::endl;                    //event2.use_count() = 1
    event2.reset();
    std::cout << "event.use_count() = " << event.use_count() << std::endl;                      //event.use_count() = 0
    std::cout << "event2.use_count() = " << event2.use_count() << std::endl;                    //event2.use_count() = 0

    return 0;

上面代码中,我们通过 std::make_shared<std::string>("This is an event.") 创建了一个指向字符串的 shared_ptr。然后我们复制这个指针到了 event2,现在两个指针都指向了同一个字符串。当我们在最后调用 event.reset()event2.reset() 时,因为两个指针都不再引用这个字符串,所以这个字符串就会被销毁。

如何确认引用计数为0后,被共享指针管理的共享对象是否已销毁?

可以在共享对象的析构函数中设置标识,然后在确定引用计数为0后,检查这个标识以确定共享对象是否已销毁。

#include <iostream>
#include <memory>

class A

public:
    A()
    
        std::cout << "A Constructed" << std::endl;
    
    ~A()
    
        std::cout << "A Destructed" << std::endl;
    
;

int main()

    std::shared_ptr<A> pA(new A);
    std::cout << "A's Reference Count: " << pA.use_count() << std::endl;
    std::shared_ptr<A> pB = pA;
    std::cout << "A's Reference Count: " << pA.use_count() << std::endl;
    std::cout << "B's Reference Count: " << pB.use_count() << std::endl;
    pA.reset();
    std::cout << "A's Reference Count: " << pA.use_count() << std::endl;
    std::cout << "B's Reference Count: " << pB.use_count() << std::endl;
    pB.reset();
    std::cout << "A's Reference Count: " << pA.use_count() << std::endl;
    std::cout << "B's Reference Count: " << pB.use_count() << std::endl;

    return 0;


编译运行:

g++ test.cpp && ./a.out

结果:

以上是关于linux C++共享指针(std::shared_ptrstd::make_shared)共享对象,reset()重置共享指针,use_count()查看引用计数的主要内容,如果未能解决你的问题,请参考以下文章

现代 C++一文读懂智能指针

C++智能指针

C++智能指针

深入了解C++ (15) | 源码分析auto_ptr & unique_ptr 设计

C++关于锁的总结

共享指针列表的共享指针