Daniel S.
Daniel S.

Reputation: 6640

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

The GMP library provides a big int C API and a C++ API which wraps the C API. Usually you initialize an mpz_t struct (C API) by doing

mpz_t integ;
mpz_init(integ);

(see 5.1 Initialization Functions). When doing so, you later have to free the memory with mpz_clear(integ);. The C++ API's mpz_class handles this deallocation automatically for you.

Now, if you want to initialize an mpz_t based on existing memory, and you don't want to copy the memory contents, you can use the function mpz_roinit_n() (5.16 Integer Special Functions) for a memory area pointed to by xp:

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

This initializes x in a special way so it can be used as a read-only input operand (hence the ro in the function name) to other mpz functions. Now, the documentation of mpz_clear(integ) says this:

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

I wonder if mpz_t's which have been initialized with a call to mpz_roinit_n() are an exemption to this rule, because they don't need to be deallocated.

If I'm correct, this would also mean that mpz_roinit_n() can't be used with the C++ API's mpz_class, not even with mpz_class.get_mpz_t(), because mpz_class's destructor always tries to deallocate the underlying mpz_t, and this would cause memory issues. Am I correct here?

Upvotes: 1

Views: 213

Answers (1)

Marc Glisse
Marc Glisse

Reputation: 7915

mpz_clear does nothing on a mpz_t set with mpz_roinit_n. So you don't need to call it, but it is still safe if it gets called.

Upvotes: 1

Related Questions