2016-01-21 39 views
0

我修改了boost :: asio的Timer.4示例,并用第二个参数间隔调用打印机类,并在间隔少时抛出不止一个。async_wait()in boost :: asio当io_service.run()在try-catch后立即触发

当io.run()在try-catch中时,计时器在指定的时间后被触发。

boost::asio::io_service io; 

try { 
    Printer p { io, 2 }; 
    p.print(); 
    io.run(); 
} catch (std::exception& e) { 
    std::cerr << e.what() << std::endl; 
} 

但是,当我将它移动到try-catch的下方时,会立即触发。

try { 
    Printer p { io, 2 }; 
    p.print(); 
} catch (std::exception& e) { 
    std::cerr << e.what() << std::endl; 
} 

io.run(); 

这可能是一个逻辑上的解释,它立即在try-catch之外触发。有人可以阐明这一点吗?

回答

2

这是因为p在您离开try-catch范围时正在销毁。 C++有RAII编程技术。了解更多关于这个http://en.cppreference.com/w/cpp/language/raii

下面的例子应该工作:

Printer p { io, 2 }; 
try { 
    p.print(); 
} catch (std::exception& e) { 
    std::cerr << e.what() << std::endl; 
} 

io.run();