【C++】shared指针循环了怎么办?(约209字)

1、使用 std::weak_ptr

  • std::weak_ptr 是一种弱引用,它不会增加对象的引用计数。当 std::shared_ptr 引用的对象被销毁时,相应的 std::weak_ptr 将自动变为无效。
  • 你可以将一个 std::shared_ptr 转换为 std::weak_ptr 来打破循环引用。
cpp
#include 

class A;
class B;

class A {
public:
    std::shared_ptr b;
    void setB(std::shared_ptr bptr) {
        b = bptr;
    }
};

class B {
public:
    std::weak_ptr a;
    void setA(std::shared_ptr aptr) {
        a = aptr;
    }
};

在这个例子中,A 类持有 Bstd::shared_ptr,而 B 类持有 Astd::weak_ptr

2、使用 std::enable_shared_from_this

  • 这个基类提供了一个方法 shared_from_this(),它允许从 this 指针创建一个 std::shared_ptr
  • 通常与 std::weak_ptr 一起使用,以避免循环引用。
cpp
#include 

class A : public std::enable_shared_from_this {
public:
    std::weak_ptr self;
    void setSelf() {
        self = shared_from_this();
    }
};

class B {
public:
    std::shared_ptr a;
    void setA(std::shared_ptr aptr) {
        a = aptr;
    }
};

在这个例子中,A 类使用 std::enable_shared_from_this 来避免循环引用。

3、避免不必要的共享指针

  • 有时候,某些对象不需要被 std::shared_ptr 管理。考虑使用裸指针或 std::unique_ptr 来减少不必要的引用计数。

4、使用 std::shared_ptr 的自定义删除器

  • 通过自定义删除器,可以在对象销毁时执行一些清理操作,从而间接打破循环引用。

THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容