给已经写好的 递归函数 添加 释放内存 代码 的方法

2019-04-26  本文已影响0人  星星之火666
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 点坐标的内存代码。

上一篇 下一篇

猜你喜欢

热点阅读