- 如题,这是 sm2 国密算法中 常数 乘以 点 坐标 的一段 代码,现在想要 释放 t1 点坐标 内存,该如何添加 释放内存 代码呢?:(部分代码)
point sm2::oval_multiply(BIGNUM* k, point G) // 参数 不 改变! // 所有 new 均已释放
{
/* 返回值 需要 BN_free()
椭圆曲线上的点乘以常数 k
:param k: int 型 k*G 中的 k
:param G: 生成元,基点
:return: 相乘之后的点
*/
// if k==1:
// return G // 只有 k 取 1 时,才有这种可能
static BN_CTX* ctx = BN_CTX_new();
static BIGNUM* rem = BN_new(), * div = BN_new(), * div1 = BN_new(), * two = BN_new();
static point t, t1; // 即 t 、t1 初始值 ={} // 临时 点 temp
BN_set_word(two, 2);
BN_nnmod(rem, k, two, ctx);
BN_div(div, NULL, k, two, ctx);
if (BN_is_word(k, 2))
{
//// 释放内存
//BN_free(two);
//BN_CTX_free(ctx);
//BN_free(rem);
//BN_free(div);
//BN_free(div1);
// 是 t1 第一次出现的地方
t1 = oval_same_add(G);
return t1;
}
if (BN_is_word(k, 3))
{
//// 释放内存
//BN_free(two);
//BN_CTX_free(ctx);
//BN_free(rem);
//BN_free(div);
//BN_free(div1);
t = oval_same_add(G);
// 是 t1 第一次出现的地方
t1 = oval_diff_add(G, t);
t.point_free(t);
return t1;
}
if (BN_is_zero(rem))
{
BN_copy(div1, div);
t = oval_multiply(div1, G);
t1 = oval_same_add(t);
t.point_free(t);
return t1;
}
if (BN_is_one(rem))
{
BN_copy(div1, div);
t = oval_multiply(div1, G);
t1 = oval_diff_add_near(t, G);
t.point_free(t);
return t1;
}
}
- 添加方法:
先给定具体实际参数,然后将此函数的代码执行过程,一一写到纸上(像伪代码一样的过程,不要害怕重复),然后添加 t1 点坐标 释放内存代码,即可 ( 这样可以比较清晰的添加代码,不易出错 )
- 附注:
因为此函数返回的指针指向一片内存,并且 将 t1 赋给 t,所以 t 和 旧的 t1 指针,指向同一片内存,所以释放 t ,相当于 释放 旧的 t1 指向的内存,所以不能添加 释放 t1 点坐标的内存代码。
网友评论