#include <iostream>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/enable_shared_from_this.hpp>
class A: public boost::enable_shared_from_this<A>
{
typedef boost::function<int()> GET;
public:
A()
{
std::cout << "A::A() " << this << std::endl;
}
~A()
{
std::cout << "A::~A()" << this <<std::endl;
}
void set()
{
myget=boost::bind(&A::get, shared_from_this());
}
问题是:当我用shared_from_this()绑定它时,它不会被释放。但如果我用它绑定它(boost :: bind(&amp; A :: get,this)),实例将被释放。
int getI()
{
myget();
}
inline int get()
{
return 1;
}
private:
GET myget;
};
void test()
{
boost::shared_ptr<A> a(new A);
a->set();
a->getI();
}
int main()
{
test();
return 0;
}
我的问题是:为什么即使程序已经关闭,A的实例也永远不会被释放?
答案 0 :(得分:2)
问题是myget
变量阻止了析构函数的运行。
所以你甚至无法做到
~A() {
std::cout << "A::~A()" << this << std::endl;
myget = {};
}
这就是发明了弱点的原因。但在这种特殊情况下,您可以简单地使用this
,因为在A的生命周期之后无法访问myget