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

时间:2016-10-31 18:50:15

标签: c++ boost gmp

我正在使用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)会产生正确的结果。我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

好的,在制作完这个答案并查看代码后,我看到了错误。当我应该返回number时,我正在返回id。这就是转换构造函数应该是显式的原因:)

所以是的,构造函数会复制mpz_int。但是我可以在它被复制之前释放它(在函数返回时)。另外我每次都泄漏一次mpz_t。