最近我开始研究C ++中的内存泄漏问题,所以我可能会问一个天真的问题。
我有一个使用OpenSSL的c ++库 – 我的任务是检查这个库中是否有内存泄漏。 我已经运行了Visual Leak Detector来检查内存泄漏。
我看到调用SSL_library_init();
和SSL_load_error_strings();
是领先的泄漏 – 快速searchGoogle显示,在使用的最后,我不得不呼吁以下:
CONF_modules_free(); ERR_remove_state(0); ENGINE_cleanup(); CONF_modules_unload(1); ERR_free_strings(); EVP_cleanup(); CRYPTO_cleanup_all_ex_data();
泄漏确实减less了,但仍然有两个泄漏(VLD工具显示我)因为SSL_library_init
调用而发生SSL_library_init
。
有谁知道还有什么我必须做的,以释放所有的内存泄漏?
据我所知在SSL_library_init()
和SSL_load_error_strings()
期间分配的所有内存都存储在全局变量中,所以它属于“使用中的内存”的类别,而不是在内存泄漏的类别下,因为内存仍然可以访问程序正在消失。
一个建议是必须在使用SSL的每个线程中调用ERR_remove_state(0)
,因为当您使用参数0调用ERR_remove_state
时,它只会清除当前线程的错误状态。 其他电话对我来说似乎很好。 如果你可以发布,VLD仍然显示“两次泄漏”,我可以检查。
要摆脱SSL_library_init()中分配的最后两个内存块,请尝试:
sk_free(SSL_COMP_get_compression_methods());
为了摆脱Joe H的回答中的编译错误:
sk_SSL_COMP_free(SSL_COMP_get_compression_methods());
调用SSL_COMP_free_compression_methods();
。