c++ - 内存泄漏。如何正确使用删除?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
解决方案
问题:泄漏
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
编辑的内存),因此您无法自己安全地释放它。的文档BN_bn2hex
指示您使用OPENSSL_free
.
解决方法:删除
不要delete
。而是按照文档中的说明使用OPENSSL_free
.
边注
在尝试使用它之前检查它result_str
不是。NULL
如果结果是NULL
,请使用ERR_get_error
找出原因。