
Christopher Kohlhoff wrote:
boost::asio::socket_acceptor tcp_acceptor(demuxer, boost::asio::ipv4::tcp::endpoint(13));
boost::asio::stream_socket* tcp_socket = new boost::asio::stream_socket(demuxer);
tcp_acceptor.async_accept(*tcp_socket, boost::bind(handle_tcp_accept, &tcp_acceptor, tcp_socket, boost::asio::placeholders::error));
For example, what happens here if async_accept fails, perhaps because of insufficient memory? Does it throw bad_alloc?
It could.
Is the handler executed?
No (according to above rules).
Not good. If you want the library to support this low-level style, the above snippet should be exception-safe; this could be accomplished by calling the handler with an appropriate asio error code. This aside, why would one need shared_from_this? boost::asio::socket_acceptor tcp_acceptor(demuxer, boost::asio::ipv4::tcp::endpoint(13)); boost::shared_ptr<boost::asio::stream_socket> tcp_socket( new boost::asio::stream_socket(demuxer) ); tcp_acceptor.async_accept(*tcp_socket, boost::bind(handle_tcp_accept, &tcp_acceptor, tcp_socket, boost::asio::placeholders::error));