Вызов функции-члена через неверный указатель дает неопределенное поведение.
В этом случае ничто на самом деле не разыменовывает этот указатель, поскольку handleAccept
не является виртуальным и не имеет доступа к переменным-членам, поэтому неопределенное поведение кода, сгенерированного вашим конкретным компилятором, соответствует тому, что произойдет, если указатель все еще действителен. Это прискорбно, поскольку затрудняет поиск ошибки.
Одна возможность, проиллюстрированная в некоторых примерах Asio, таких как этот , состоит в управлении классом acceptor
с помощью общих указателей; наследуя от enable_shared_from_this<acceptor>
, вы можете связать функцию accept с общим указателем, а не с необработанным указателем this
:
a->async_accept(*ptr,
boost::bind(&acceptor::handleAccept,
shared_from_this(), // <--- not "this"
ptr, asio::placeholders::error));
Тогда объект будет оставаться живым до тех пор, пока handleAccept
не завершится; и дольше, если это связывает shared_from_this()
с дальнейшими асинхронными операциями.