我正在使用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
的调用提升了:: multiprecision :: mpz_int constructor 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)
会产生正确的结果。我在这里缺少什么?
答案 0 :(得分:0)
好的,在制作完这个答案并查看代码后,我看到了错误。当我应该返回number
时,我正在返回id
。这就是转换构造函数应该是显式的原因:)
所以是的,构造函数会复制mpz_int。但是我可以在它被复制之前释放它(在函数返回时)。另外我每次都泄漏一次mpz_t。