Recentemente ho iniziato a studiare le perdite di memoria in C++, quindi potrei fare una domanda ingenua.
Ho una libreria C++ che sta usando OpenSSL - il mio compito è controllare se ci sono perdite di memoria in questa libreria. Ho lanciato Visual Leak Detector per controllare le perdite di mem.
vedo che le chiamate a SSL_library_init();
e SSL_load_error_strings();
conducono perdita - pratica googling dimostra che alla fine dell'utilizzo devo chiamare i seguenti:OpenSSL :: SSL_library_init() perdita di memoria
CONF_modules_free();
ERR_remove_state(0);
ENGINE_cleanup();
CONF_modules_unload(1);
ERR_free_strings();
EVP_cleanup();
CRYPTO_cleanup_all_ex_data();
La perdita infatti è diminuita, ma ancora ci sono due perdite (che lo strumento VLD mi mostra) che accade perché la chiamata SSL_library_init
.
qualcuno sa cos'altro devo fare per liberare tutte le perdite di mem?
Non consiglierei EVP_cleanup() e CRYPTO_cleanup_all_ex_data(). Se nell'applicazione sono presenti più librerie, diciamo libssh2, non sappiamo quando verrà chiamato, e questo scaricherà tutte le tabelle e pulirà tutti i dati globali. Prendendo in considerazione questa domanda, una delle librerie open source aperte da Pegasus lo ha implementato, e questo sta causando arresti anomali nella nostra applicazione. Questa libreria aperta di Pegasus sta cancellando tutta la tabella e i dati globali di openssl una volta che l'utilizzo è terminato. Altre librerie in altri thread stanno fallendo proprio nel mezzo a causa della pulizia. – Srikan
L'utilizzo al posto giusto è importante. – Srikan
Correlato, vedere anche [Come disinstallare correttamente OpenSSL] (http://stackoverflow.com/q/29845527). – jww