OpenSSL::SSL_library_init()内存泄漏

OpenSSL::SSL_library_init() memory leak

本文关键字:内存 泄漏 library SSL OpenSSL init      更新时间:2023-10-16

最近我开始研究C++中的内存泄漏,所以我可能会问一些天真的问题
我有一个使用OpenSSL的c++库,我的任务是检查这个库中是否存在内存泄漏。我已经运行了视觉泄漏检测器来检查内存泄漏
我看到对SSL_library_init();SSL_load_error_strings();的调用导致了泄漏——快速谷歌搜索显示,在使用结束时,我必须调用以下命令:

CONF_modules_free();
ERR_remove_state(0);
ENGINE_cleanup();
CONF_modules_unload(1);
ERR_free_strings();
EVP_cleanup();
CRYPTO_cleanup_all_ex_data();

泄漏确实减少了,但仍然有两个泄漏(VLD工具向我展示)是因为SSL_library_init调用而发生的
有人知道我还需要做什么才能释放所有内存泄漏吗?

要消除Joe H的答案中的编译错误:

sk_SSL_COMP_free(SSL_COMP_get_compression_methods());

据我所知,在SSL_library_init()SSL_load_error_strings()期间分配的所有内存都存储在全局变量中,因此它属于"使用中的内存"类别,而不是内存泄漏类别,因为当程序耗尽时,内存仍然可以访问。

一个建议是,必须在使用SSL的每个线程中调用ERR_remove_state(0),因为当使用参数0调用ERR_remove_state时,它只会清除当前线程的错误状态。其他电话对我来说似乎很好。如果你能发布VLD仍在显示的"两次泄漏",我可以检查一下。

要清除中分配的最后两个内存块SSL_library_int()尝试:

sk_free(SSL_COMP_get_compression_methods());

调用SSL_COMP_free_compression_methods();