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

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

作者: 星星之火666 | 来源:发表于2019-04-26 11:04 被阅读0次
    • 如题,这是 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 点坐标的内存代码。

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/wcqfnqtx.html