15

最近我开始研究 C++ 中的内存泄漏,所以我可能会问一个幼稚的问题。
我有一个使用 OpenSSL 的 c++ 库——我的任务是检查这个库中是否存在内存泄漏。我已经运行 Visual Leak Detector 来检查内存泄漏。
我看到调用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调用而发生。
有谁知道我还需要做什么才能释放所有的内存泄漏?

4

4 回答 4

7

摆脱 Joe H 回答中的编译错误:

sk_SSL_COMP_free(SSL_COMP_get_compression_methods());
于 2013-03-28T16:15:18.993 回答
6

据我了解,所有在全局变量中分配SSL_library_init()SSL_load_error_strings()存储在全局变量中的内存,因此它属于“使用中的内存”类别,而不是内存泄漏类别,因为当程序快要消失时,内存仍然可以访问。

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

于 2012-08-02T06:08:14.323 回答
6

要摆脱 SSL_library_init() 中分配的最后两个内存块,请尝试:

sk_free(SSL_COMP_get_compression_methods());
于 2013-03-07T14:22:58.023 回答
3

打电话SSL_COMP_free_compression_methods();

于 2015-04-09T10:40:00.767 回答