Утечка памяти. Как правильно использовать delete? BN_bn2hex _CrtIsValidHeapPointer (блок) - PullRequest
0 голосов
/ 05 сентября 2018

Я новичок в C ++. Я не могу объявить result_str как * result_str. Что я делаю неправильно? Как избежать утечки памяти? Функция BN_bn2hex: char * BN_bn2hex (const BIGNUM * a);

    point_compressed_dec = EC_POINT_point2bn(group, pub_key, POINT_CONVERSION_COMPRESSED, NULL, ctx); //public DEC format

    char *result_str = new char;
    result_str = BN_bn2hex(point_compressed_dec); 

    out << result_str << endl;

    char *result_str2 = new char; // Works fine
    *result_str2 = 5;             //

    delete result_str;  // Doesn't work
    delete result_str2; // Works fine

1 Ответ

0 голосов
/ 05 сентября 2018

Проблема: утечка

char *result_str = new char;

Выделяет один символ указывает result_str на него.

result_str = BN_bn2hex(point_compressed_dec);

переназначает result_str, чтобы указать на что-то, возвращенное BN_bn2hex, которое может или не может быть delete -поддерживаемым. Единственный символ, назначенный в строке выше, просочился, потому что ничто больше не указывает на это.

Решение: утечка

Не выделяйте этого персонажа. Тебе это не нужно. Вместо этого присвойте результат BN_bn2hex непосредственно result_str.

char *result_str = BN_bn2hex(point_compressed_dec);

Проблема: удалить

После

result_str = BN_bn2hex(point_compressed_dec);

result_str указывает на строку, возвращаемую BN_bn2hex. Поскольку вы не знаете, как была выделена память (вы можете только безопасно delete то, что было new ed), вы не можете безопасно освободить ее самостоятельно. В документации для BN_bn2hex содержится указание освободить эту память с помощью OPENSSL_free.

Решение: удалить

Не delete. Вместо этого следуйте инструкциям в документации и используйте OPENSSL_free.

Sidenote

Убедитесь, что result_str не NULL, прежде чем пытаться его использовать. Если результат NULL, используйте ERR_get_error, чтобы выяснить, почему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...