【问题标题】:Using GMP, omit mpz_clear() after mpz_roinit_n()?使用 GMP,在 mpz_roinit_n() 之后省略 mpz_clear()?
【发布时间】:2022-08-24 16:43:09
【问题描述】:

GMP 库提供了一个大的 int C API 和一个包装 C API 的 C++ API。通常你通过做初始化一个mpz_t struct (C API)

mpz_t integ;
mpz_init(integ);

(见5.1 Initialization Functions)。这样做时,您稍后必须使用mpz_clear(integ); 释放内存。 C++ API 的mpz_class 会自动为您处理此释放。

现在,如果你想在现有内存的基础上初始化一个mpz_t,并且你不想复制内存内容,你可以使用函数mpz_roinit_n()5.16 Integer Special Functions)对@指向的内存区域987654329@:

mpz_srcptr mpz_roinit_n(mpz_t x, const mp_limb_t *xp, mp_size_t xs)

这会以特殊方式初始化x,因此它可以用作其他mpz 函数的只读输入操作数(因此函数名称中的ro)。现在,mpz_clear(integ) 的文档是这样说的:

释放 x 占用的空间。为所有 mpz_t 调用此函数 完成后的变量。

我想知道通过调用mpz_roinit_n() 初始化的mpz_t 是否是该规则的豁免,因为它们不需要被释放。

如果我是正确的,这也意味着mpz_roinit_n() 不能与 C++ API 的mpz_class 一起使用,甚至不能与mpz_class.get_mpz_t() 一起使用,因为mpz_class 的析构函数总是试图释放底层mpz_t,这会导致内存问题。我在这里正确吗?

    标签: c++ c gmp


    【解决方案1】:

    mpz_clear 对带有 mpz_roinit_nmpz_t 集没有任何作用。所以你不需要调用它,但如果它被调用它仍然是安全的。

    【讨论】: