TokeyJs 发表于 2024-3-30 17:28

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;
}

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

#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:18

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

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

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

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一起使用 ...

使用智能指针,可以确保没有内存资源泄漏;
循环引用,避免死循环:加退出条件、加同步机制等措施。
页: [1]
查看完整版本: C++ shared_ptr 循环引用问题