我是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
答案 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('/');
}
找出原因。