使用 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_clear
对 mpz_t
集和 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_clear
对 mpz_t
集和 mpz_roinit_n
不执行任何操作。所以你不需要调用它,但是调用它仍然是安全的。