【发布时间】:2014-11-21 16:27:21
【问题描述】:
我正在使用 boostdeadline_timer,似乎在删除拥有对象后调用其处理程序。我已经尝试了几种方法来让它发挥作用。
首先我只是通过使用“shared_from_this”绑定到处理程序和拥有对象来使用计时器
m_timer.expires_from_now(boost::posix_time::seconds(m_nHandshakeTimeout));
m_timer.async_wait(
boost::bind(&CTcpSslSocket::handle_handshake_timeout,
shared_from_this(),
boost::asio::placeholders::error)
);
此方法使计时器正确运行,但也导致持有对拥有对象的引用。我表明我在关闭应用程序时泄露了拥有对象。不久前我遇到了一个类似的问题,该问题已使用弱指针解决(感谢 stackoverflow 上其他人的帮助)。我通过这样做尝试了与计时器相同的事情:
m_timer.expires_from_now(boost::posix_time::seconds(m_nHandshakeTimeout));
boost::weak_ptr<CTcpSslSocket> weak( shared_from_this() );
m_timer.async_wait([=]( const boost::system::error_code& error ) {
boost::shared_ptr<CTcpSslSocket> strong(weak);
if ( strong ) {
strong->handle_handshake_timeout(error);
}
return;
});
就计时器功能而言,这似乎也可以正常工作,但在关闭应用程序时会导致内存损坏。在调试器中运行显示在 boost 代码调用处理程序时发生了异常。
如果我使用定时器的操作在给定时间内完成,我会取消定时器,否则我不会对定时器做任何事情。这是取消代码:
if ( m_eHandshakeTimer != eExpired )
{
m_eHandshakeTimer = eCanceled;
m_timer.cancel();
}
关于如何解决这个问题的任何想法?
【问题讨论】: