Утечка памяти OpenSSL:: SSL_library_init()
Недавно я начал изучать утечки памяти на С++, поэтому я могу задать наивные вопросы.
У меня есть библиотека С++, использующая OpenSSL - моя задача - проверить, нет ли утечек памяти в этой библиотеке. Я проверил визуальный детектор утечки, чтобы проверить утечки памяти.
Я вижу, что вызовы SSL_library_init();
и SSL_load_error_strings();
приводят к утечке - быстрый поиск в googling показывает, что в конце использования я должен вызвать следующие действия:
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
.
кто-нибудь знает, что еще мне нужно сделать, чтобы освободить все утечки памяти?
Ответы
Ответ 1
Как я понимаю, вся память, выделенная во время SSL_library_init()
и SSL_load_error_strings()
, хранится в глобальных переменных и поэтому попадает под категорию "Память в использовании" скорее под категорию утечки памяти, поскольку память все еще доступный, когда программа вымирает.
Одно из предложений заключается в том, что ERR_remove_state(0)
необходимо вызывать в каждом потоке, где используется SSL, потому что когда вы вызываете ERR_remove_state
с аргументом 0, он просто очищает состояние ошибки для текущего потока. Мне нравятся другие звонки. Если вы можете опубликовать "два утечки", которые все еще отображаются VLD, я могу проверить.
Ответ 2
Чтобы избавиться от последних двух блоков памяти, выделенных в SSL_library_init()
попробуйте:
sk_free(SSL_COMP_get_compression_methods());
Ответ 3
Чтобы избавиться от ошибки компиляции в ответе Джо H:
sk_SSL_COMP_free(SSL_COMP_get_compression_methods());
Ответ 4
Вызов SSL_COMP_free_compression_methods();
.