C++ shared_ptr 循环引用问题
求助,有大佬能解释一下这个循环引用问题吗?有点难理解{:1_893:}class TTT {
public:
TTT() {
std::cout << "构造" << std::endl;
}
~TTT() {
std::cout << "析构" << std::endl;
}
std::function<void()> Func_;
};
void fu(std::shared_ptr<TTT> t) {
}
int main() {
std::shared_ptr<TTT> ti(new TTT);
ti->Func_ = std::bind(fu, ti);
return 0;
} std::shared_ptr<TTT> ti(new TTT); 引用计数+1
std::bind(fu, ti); 绑定时又增加了一个引用计数+1
return 0; 程序结束前,由于没有别的使用的引用数会自动-1 ,但是最后还不为0个引用,所以不会执行析构
#include<iostream>
class TTT {
public:
TTT() {
std::cout << "constructor" << std::endl;
}
~TTT() {
std::cout << "destory" << std::endl;
}
std::function<void()> Func_;
};
void fu(std::shared_ptr<TTT> t) {
}
int main() {
//std::function<void()> Func_;
std::shared_ptr<TTT> ti(new TTT);
std::cout << "shared_ptr count:" << ti.use_count() << '\n';
ti->Func_ = std::bind(fu, ti);//bind 时 Func_保存了一个引用
std::cout << "shared_ptr count:" << ti.use_count() << '\n';
ti->Func_ = nullptr;//但是这样就没意思了
std::cout << "shared_ptr count:" << ti.use_count() << '\n';
return 0;
} 本帖最后由 hunfeifei 于 2024-3-30 20:20 编辑
ti->Func_ = std::bind(fu, ti);
绑定之后。ti 保存了 指向了 TTT对象。
TTT对象里面 保存了 ti指针。互相引用了。
想要解决的话 创建个共有函数
void Release()
{
Func_ = nullptr;
}
结束之前 手动调用一下就好了 互相引用了,导致引用计数永远不能减为0,也就不能自动释放了,建议了解一下shared_ptr和weak_ptr一起使用即可解决 jamesAbc 发表于 2024-3-30 22:12
互相引用了,导致引用计数永远不能减为0,也就不能自动释放了,建议了解一下shared_ptr和weak_ptr一起使用 ...
使用智能指针,可以确保没有内存资源泄漏;
循环引用,避免死循环:加退出条件、加同步机制等措施。
页:
[1]