首页 > 解决方案 > 内存泄漏。如何正确使用删除?BN_bn2hex _CrtIsValidHeapPointer(块)

问题描述

我是 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

标签: c++openssl

解决方案


问题:泄漏

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。由于您不知道内存是如何分配的(您只能安全地分配deletenew编辑的内存),因此您无法自己安全地释放它。的文档BN_bn2hex指示您使用OPENSSL_free.

解决方法:删除

不要delete。而是按照文档中的说明使用OPENSSL_free.

边注

在尝试使用它之前检查它result_str不是。NULL如果结果是NULL,请使用ERR_get_error找出原因。


推荐阅读