gpt4 book ai didi

c++ - boost asio set_verify_callback 泄漏 shared_ptr

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:42:48 30 4
gpt4 key购买 nike

我在 ssl 套接字上使用 set_verify_callback 时发现泄漏。我有一个类“CClientSock”,其成员为“boost::asio::ssl::stream m_socket;”

我的 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”中完成某些操作才能释放引用?

最佳答案

您可以通过保留 shared_ptr<CClientSock> 来获得循环引用在验证回调中。上下文维护一个 boost::asio::ssl::detail::verify_callback 成员,其中包含您的共享指针。要打破循环,请使用带有 lambda 的弱指针

std::weak_ptr<CClientSock> weak( shared_from_this() );
m_socket.set_verify_callback([weak](bool p, boost::asio::ssl::verify_context& context) {
std::shared_ptr<CClientSock> strong( weak );
if ( strong ) {
strong->verify_certificate( p, context );
}
});

关于c++ - boost asio set_verify_callback 泄漏 shared_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26040055/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com