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 the
mpz_t, because the
boost::multiprecision::mpz_intconstructor copies the value of the
mpz_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
我在 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 the
mpz_t, because the
boost::multiprecision::mpz_intconstructor copies the value of the
mpz_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