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));
虽然问题解决了,但是感觉不是很对,希望有人能指教。最好是用智能指针自动管理对象。