boost::multiprecision::mpz_int 构造函数是否复制 mpz_t?

Does boost::multiprecision::mpz_int constructor copy the mpz_t?

我在 gmp 后端使用 boost multiprecision。考虑以下代码从二进制表示构造多精度数字:

typedef boost::multiprecision::mpz_int BigInt;

BigInt createNumber(const unsigned char* in, size_t length)
{
    mpz_t number;
    mpz_init2(number, length);
    mpz_import(number, 1, 1, length, 1, 0, in);
    BigInt id(number);
    mpz_clear(number);
    return number;
}

我的印象是调用 mpz_clear(number)´ is required to not leak thempz_t, because theboost::multiprecision::mpz_intconstructor copies the value of thempz_t `,因此不拥有它。通过使用调试器,我发现这个构造函数被调用:

gmp_int(const mpz_t val)
{
    mpz_init_set(this->m_data, val);
}

这似乎证实了我的怀疑,因为 mpz_init_set 使用操作数的值初始化内部 mpz_t 变量,而不是仅仅复制 mpz_t.

但是当我执行 mpz_clear(number) 释放内存时,我得到了构造的 BigInt 的错误值。删除 mpz_clear(number) 会产生正确的结果。我在这里错过了什么?

好的,在编写这个答案并查看代码后我发现了错误。当我应该returnid 时,我returnnumber。这就是为什么转换构造函数应该是显式的:)

所以是的,构造函数确实复制了 mpz_int。但是我在它被复制之前就释放了它(在函数 return 上)。另外我每次都漏一个mpz_t