gpt4 book ai didi

c++ - boost deadline_timer 持有对对象的引用

转载 作者:太空宇宙 更新时间:2023-11-04 13:42:57 25 4
gpt4 key购买 nike

我正在使用一个 boost deadline_timer,它似乎在拥有的对象被删除后调用它的处理程序。我已经尝试了几种方法来让它发挥作用。

首先,我只是通过绑定(bind)到处理程序和使用“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();
}

关于如何解决这个问题有什么想法吗?

最佳答案

当然,持有一个弱指针并不能使对象 (CTcpSslSocket) 保持事件状态。

弱指针只能观察共享指针拥有的对象的生命周期结束。

改为让异步操作共享 所有权。这样,当您检测到计时器已被取消时,您将自动释放共享对象。

m_timer.expires_from_now(boost::posix_time::seconds(m_nHandshakeTimeout));
auto This = shared_from_this();
m_timer.async_wait([=]( const boost::system::error_code& error ) {
if (ec != boost::asio::error::operation_aborted) {
This->handle_handshake_timeout(error);
// ^ could share This with other handlers to keep it alive
}
return;
});

关于c++ - boost deadline_timer 持有对对象的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27065954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com