当两个对象相互引用并使用shared_ptr
时,就会形成循环引用。例如,考虑一个简单的场景:
```
include
include
class B; // 前置声明
class A {
public:
std::shared_ptr b_ptr;
A() { std::cout << "A constructor" << std::endl; }
~A() { std::cout << "A destructor" << std::endl; }
};
class B {
public:
std::shared_ptr a_ptr;
B() { std::cout << "B constructor" << std::endl; }
~B() { std::cout << "B destructor" << std::endl; }
};
int main() {
std::shared_ptr a = std::make_shared();
std::shared_ptr b = std::make_shared();
a->b_ptr = b;
b->a_ptr = a;
return 0;
}
```
在这个例子中,类 A
拥有一个指向类 B
的 shared_ptr
,而类 B
拥有一个指向类 A
的 shared_ptr
。这样就形成了循环引用。
为了避免循环引用,我们可以改用 weak_ptr
来解决这个问题:
```
include
include
class B; // 前置声明
class A {
public:
std::shared_ptr b_ptr;
A() { std::cout << "A constructor" << std::endl; }
~A() { std::cout << "A destructor" << std::endl; }
};
class B {
public:
std::weak_ptr a_weak_ptr; // 使用 weak_ptr
B() { std::cout << "B constructor" << std::endl; }
~B() { std::cout << "B destructor" << std::endl; }
};
int main() {
std::shared_ptr a = std::make_shared();
std::shared_ptr b = std::make_shared();
a->b_ptr = b;
b->a_weak_ptr = a; // 使用 weak_ptr
return 0;
}
```
通过将类 B
中指向类 A
的指针改为 weak_ptr
,我们成功地避免了循环引用问题。
暂无评论内容