https://www.cnblogs.com/fortunely/p/16370208.html
// 循环引用示例:通过传递函数或lambda表达式,为成员变量设置回调,导致循环引用
#include <memory>
#include <iostream>
#include <functional>
using namespace std;
class B
{
public:
typedef std::function<void(void)> Callback;
B()
{
cout << "Create a new B object" << endl;
}
~B()
{
cout << "Destroy an B object" << endl;
}
void setCallback(Callback cb)
{
cb_ = std::move(cb);
}
void exeFunc()
{
cb_();
}
private:
Callback cb_;
};
class A : public enable_shared_from_this<A>
{
public:
A()
: b(new B)
{
cout << "Create a new A object" << endl;
}
~A()
{
cout << "Destroy an A object" << endl;
}
void print()
{
cout << "A print()" << endl;
}
void func()
{
shared_ptr<A> me = shared_from_this();
b->setCallback(std::bind(&A::onMessage, me)); // 将包裹this的shared_ptr指针交给了b的Callback cb_成员接管, 导致循环引用
}
void func1()
{
shared_ptr<A> me = shared_from_this();
b->setCallback([me]() { // 将包裹this的shared_ptr指针, 通过lambda表达式交给了b的Callback cb_成员接管, 导致循环引用
me->onMessage();
});
}
private:
void onMessage(void)
{
cout << "A onMessage" << endl;
}
shared_ptr<B> b;
};
int main()
{
shared_ptr<A> a(new A);
// 下面2行代码调用, 都将导致循环引用
a->func();
//a->func1();
return 0;
}