最近我开始研究C ++中的内存泄漏,所以我可能会问一些天真的问题
我有一个使用OpenSSL的c ++库 - 我的任务是检查此lib中是否存在内存泄漏。我运行了Visual Leak Detector来检查内存泄漏
我看到对SSL_library_init();
和SSL_load_error_strings();
的调用正在引发泄密 - 快速的Google搜索显示在使用结束时我必须调用以下内容:
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
呼叫而发生。
有谁知道我还需要做些什么来解除所有内存泄漏?
答案 0 :(得分:7)
在Joe H的回答中摆脱编译错误:
sk_SSL_COMP_free(SSL_COMP_get_compression_methods());
答案 1 :(得分:6)
去掉最后分配的两个内存块 SSL_library_init() 尝试:
sk_free(SSL_COMP_get_compression_methods());
答案 2 :(得分:5)
据我所知,在SSL_library_init()
和SSL_load_error_strings()
期间分配的所有内存都存储在全局变量中,因此它属于“使用中的内存”类别,而不属于内存泄漏类别当程序消失时,仍然可以访问内存。
一个建议是必须在使用SSL的每个线程中调用ERR_remove_state(0)
,因为当您使用参数0调用ERR_remove_state
时,它只会清除当前线程的错误状态。其他电话对我来说很好。如果您可以发布仍然由VLD显示的“两次泄密”,我可以查看。
答案 3 :(得分:3)
致电SSL_COMP_free_compression_methods();
。