Я вижу утечку при использовании set_verify_callback в ssl-сокете. У меня есть класс «CClientSock» с элементом «boost :: asio :: ssl :: stream m_socket;»boost asio set_verify_callback leaks shared_ptr
Мой класс CClientSock происходит от «enable_shared_from_this
class CClientSock : public boost::enable_shared_from_this
Если я позвоню:
m_socket.set_verify_callback( boost::bind(&CClientSock::verify_certificate, shared_from_this(), _1, _2));
тогда мой экземпляр CClientSock никогда не разрушается.
Если я не вызываю «m_socket.set_verify_callback», тогда мой экземпляр CClientSock будет уничтожен правильно.
код выглядит следующим образом:
void CClientSock::StartPoll() { m_socket.set_verify_mode(boost::asio::ssl::verify_peer | boost::asio::ssl::verify_fail_if_no_peer_cert); m_socket.set_verify_callback( boost::bind(&CClientSock::verify_certificate, shared_from_this(), _1, _2)); boost::asio::ip::tcp::resolver::iterator endpoint_iterator; endpoint_iterator = ResolveAddress("xxx.xxx.xxx.xxx", nPort); boost::asio::async_connect( m_socket.lowest_layer(), endpoint_iterator, boost::bind(&CClientSock::handle_connect, shared_from_this(), boost::asio::placeholders::error)); } bool CClientSock::verify_certificate( bool preverified, boost::asio::ssl::verify_context& ctx ) { char subject_name[256]; X509* cert = X509_STORE_CTX_get_current_cert(ctx.native_handle()); X509_NAME_oneline(X509_get_subject_name(cert), subject_name, 256); SYSTEMTIME st; GetLocalTime(&st); CString s; s.Format("%02d SSL Verify: %s", m_nId, subject_name); LogMsg(m_dwThreadId, &st, s, 0, NULL); return preverified; }
Есть ли что-то, что должно быть сделано в «set_verify_callback», чтобы освободить ссылку?
Спасибо Сэм - Я пробовал это, но не могу его скомпилировать, используя различные режимы захвата ([], [&] знак равно Я вижу различные формы: «ошибка C3493:« слабый »не может быть неявно захвачен, потому что не был задан режим захвата по умолчанию». Я не слишком хорошо знаком с лямбдами, поэтому возможны и другие варианты. Есть что-то, что мне не хватает? – Ken
@ Ken необходимо явно захватить 'weak_ptr' в лямбда, ответ был обновлен –