吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 451|回复: 5
收起左侧

[求助] C++ shared_ptr 循环引用问题

[复制链接]
TokeyJs 发表于 2024-3-30 17:28
求助,有大佬能解释一下这个循环引用问题吗?有点难理解
[C++] 纯文本查看 复制代码
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;
}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

testpapa 发表于 2024-3-30 17:49
std::shared_ptr<TTT> ti(new TTT); 引用计数+1
std::bind(fu, ti); 绑定时又增加了一个引用计数+1
return 0; 程序结束前,由于没有别的使用的引用数会自动-1 ,但是最后还不为0个引用,所以不会执行析构
Hamon 发表于 2024-3-30 20:16
[C++] 纯文本查看 复制代码
#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;
}

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
hunfeifei + 1 + 1 我很赞同!

查看全部评分

hunfeifei 发表于 2024-3-30 20:18
本帖最后由 hunfeifei 于 2024-3-30 20:20 编辑

ti->Func_ = std::bind(fu, ti);
绑定之后。ti 保存了 指向了 TTT对象。
TTT对象里面 保存了 ti指针。互相引用了。

想要解决的话 创建个共有函数
        void Release()
        {
                Func_ = nullptr;
        }
结束之前 手动调用一下就好了

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
TokeyJs + 1 + 1 谢谢@Thanks!

查看全部评分

jamesAbc 发表于 2024-3-30 22:12
互相引用了,导致引用计数永远不能减为0,也就不能自动释放了,建议了解一下shared_ptr和weak_ptr一起使用即可解决
michaelgao 发表于 2024-3-31 14:30
jamesAbc 发表于 2024-3-30 22:12
互相引用了,导致引用计数永远不能减为0,也就不能自动释放了,建议了解一下shared_ptr和weak_ptr一起使用 ...

使用智能指针,可以确保没有内存资源泄漏;
循环引用,避免死循环:加退出条件、加同步机制等措施。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-28 10:15

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表