Копирует ли конструктор boost::multiprecision:: mpz_int mpz_t?

Я использую boost multiprecision с GMP backend. Рассмотрим следующий код для построения числа многозначности из двоичного представления:

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_int constructor 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)дает правильный результат. Чего мне здесь не хватает?

1 ответ

  1. Хорошо после создания этого ответа и глядя на код я увидел ошибку. Я возвращал то numberкогда я должен был возвращать то id. Вот почему конструкторы преобразования должны быть явными 🙂

    Поэтому да конструктор копирует mpz_int. Но я освобождал его до того, как он мог быть скопирован (при возвращении функции). Кроме того, я слил один mpz_t каждый раз.