使用 GMP,在 mpz_roinit_n() 之后省略 mpz_clear()?

Using GMP, omit mpz_clear() after mpz_roinit_n()?

GMP 库提供了一个 big int C API 和一个包装 C API 的 C++ API。通常你通过

初始化一个mpz_t结构(CAPI)
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) 对于 xp:

指向的内存区域
mpz_srcptr mpz_roinit_n(mpz_t x, const mp_limb_t *xp, mp_size_t xs)

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

Free the space occupied by x. Call this function for all mpz_t variables when you are done with them.

我想知道 mpz_t 是否已经通过调用 mpz_roinit_n() 进行了初始化,因为它们不需要被释放。

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

mpz_clearmpz_t 集和 mpz_roinit_n 不执行任何操作。所以你不需要调用它,但是调用它仍然是安全的。