slan's blog

Face loneliness, or seek comfort in temporary escapes?

boost shared_ptr 使用时的一个内存泄漏注意事项

2013-09-02 22:50:00 +0000 UTC

boost shared_ptr 使用时的一个内存泄漏注意事项

自从用了智能指针之后,内存泄漏这种问题就很少发生了,不过今天运行的时候,程序狂吃内存,就是不知道哪儿出了问题。

最后虽然知道是一个低级错误,不过也值得注意下。

情况是这样的,一个拥有异步函数的类。构造代码如下:

boost::shared_ptr httpClient(new client(*m_ioServ,task,respone_));
 
httpClient->send(boost::bind(&http::MessageBack,this,_1,cb,httpClient));

send是一个异步发送函数,按理说,这个函数还没发送,因为异步原因马上返回了,httpClient就释放了,为了不让他释放,也是为了保存异步回调,这个boost::bind之后的回调函数被作为一个类的成员函数给保存了起来,如下:

class client
    {
    public:
        typedef boost::function result)> ClientCallBack;
        ClientCallBack mHttpBack;
    }

这样就产生了智能指针永远无法释放的问题,类似相互引用,成员回调对象没释放,类不会释放。类不先释放,成员更不会释放。

说到底boost bind是一个对象,保存了智能指针,导致了相互引用的问题。使用时应该注意下。

最后解决办法是client创建的时候,没有使用智能指针,直接new 一个对象,然后在MessageBack里delete,如下:

 client* httpClient=new client(*m_ioServ,task,respone_);
 httpClient->send(boost::bind(&http::MessageBack,this,_1,cb,httpClient));

虽然问题解决了,但是感觉不是很对,希望有人能指教。最好是用智能指针自动管理对象。