内存泄漏。如何正确使用删除? BN_bn2hex _CrtIsValidHeapPointer(块)

时间:2018-09-05 20:42:19

标签: c++ openssl

我是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 :(得分:2)

问题:泄漏

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被分配的内存),因此您无法安全地释放它。 The documentation for BN_bn2hex指示您使用OPENSSL_free释放此内存。

解决方案:删除

请勿delete。而是按照文档中的说明使用OPENSSL_free

侧注

在尝试使用result_str之前,请先检查NULL是否不是NULL。如果结果为ERR_get_error,请使用constructor(route: ActivatedRoute) { const path = this.getPath(route.snapshot); } private getPath(route: ActivatedRouteSnapshot): string { const urlSegments = route.pathFromRoot.map(r => r.url); return '/' + urlSegments.filter(segment => !!segment && segment.length).join('/'); } 找出原因。