绑定shared_from_this内存不会被释放

时间:2014-05-26 10:07:13

标签: c++ memory memory-management boost memory-leaks

#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的实例也永远不会被释放?

1 个答案:

答案 0 :(得分:2)

问题是myget变量阻止了析构函数的运行。

所以你甚至无法做到

~A() { 
    std::cout << "A::~A()" << this << std::endl; 
    myget = {}; 
}

这就是发明了弱点的原因。但在这种特殊情况下,您可以简单地使用this,因为在A的生命周期之后无法访问myget