小编Pel*_*lle的帖子

如何防止截止时间计时器调用已删除类中的函数?

我在一段现实代码中遇到问题,其中属于被删除类的函数被a调用boost::asio::deadline_timer,偶尔会导致分段错误.

我遇到的问题是删除deadline_timer是从同一个io_service上的另一个计时器运行的.删除第一个deadline_timer将触发对要运行的函数的最后一次调用,并出现boost::asio::error::operation_aborted错误.但是,这只能io_service在删除完成后在(相同)上进行调度,但到那时对象已被删除,因此不再有效.

所以我的问题是:我怎样才能防止这种情况发生?

以下是具有相同故障的简化示例:

//============================================================================
// Name        : aTimeToKill.cpp
// Author      : Pelle
// Description : Delete an object using a timer, from a timer
//============================================================================

#include <iostream>
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <boost/asio.hpp>
#include <boost/thread.hpp>

using namespace std;
using namespace boost;

struct TimeBomb
{
    bool m_active;
    asio::deadline_timer m_runTimer;

    TimeBomb(boost::asio::io_service& ioService)
    : m_active(true)
    , m_runTimer(ioService)
    {
        cout << "Bomb placed @"<< hex << (int)this << endl;
        m_runTimer.expires_from_now(boost::posix_time::millisec(1000));
        m_runTimer.async_wait(boost::bind(&TimeBomb::executeStepFunction, this, _1));
    }

    ~TimeBomb() …
Run Code Online (Sandbox Code Playgroud)

c++ boost-asio

7
推荐指数
1
解决办法
4961
查看次数

标签 统计

boost-asio ×1

c++ ×1