Убедитесь, , что объект жив, пока существуют обработчики, которые могут его использовать.
Вполне вероятно, что один из обработчиков, использующих этот сокет, вызывается после того, как вы вызываете close (так как
сообщает об ошибке обработчику), а затем обращается к мертвому указателю ...
Обычно обработка времени жизни может быть легко выполнена с помощью boost::shared_ptr
и boost::enable_shared_from_this
и передачей ее в обработчики. Смотрите многочисленные примеры, предоставляемые с Boost.Asio.
Как только вы познакомитесь с этой техникой, вопрос, который вы задали, будет для вас тривиальным.