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();

リークは確かに減少しましたが、呼び出しが原因で発生する 2 つのリーク (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()で割り当てられた最後の2つのメモリブロックを取り除くには、次のことを試してください。

sk_free(SSL_COMP_get_compression_methods());
于 2013-03-07T14:22:58.023 に答える
6

SSL_library_init()プログラム中に割り当てられ、グローバル変数に格納されるすべてのメモリを理解しているSSL_load_error_strings()ため、プログラムが終了してもメモリにアクセスできるため、メモリリークのカテゴリではなく、「使用中のメモリ」のカテゴリに分類されます。

1 つの提案はERR_remove_state(0)、SSL が使用されている各スレッドで呼び出す必要があるというものですERR_remove_state。引数 0 で を呼び出すと、現在のスレッドのエラー状態がクリアされるだけだからです。他の通話は私には良いようです。VLDによってまだ表示されている「2つのリーク」を投稿していただければ、確認できます。

于 2012-08-02T06:08:14.323 に答える
3

コールしSSL_COMP_free_compression_methods();ます。

于 2015-04-09T10:40:00.767 に答える