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
类持有 B
的 std::shared_ptr
,而 B
类持有 A
的 std::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
暂无评论内容