【发布时间】: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,这会导致内存问题。我在这里正确吗?