私はgmpバックエンドで倍精度を使用しています。バイナリ表現から多倍精度数を構築するために、次のコードを考えてみましょう:私はmpz_clear(number)´ is required to not leak the
mpz_t , because the
ブースト::多倍精度:: mpz_intのでconstructor copies the value of the
mpz_t`との呼び出しは、それのない所有権を取得していないという印象の下boost :: multiprecision :: mpz_intコンストラクタはmpz_tをコピーしますか?
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_init_setは、オペランドの値だけではなくmpz_t
をコピーして内部mpz_t
変数を初期化するので、私の疑いを確認しているようだ
gmp_int(const mpz_t val)
{
mpz_init_set(this->m_data, val);
}
:デバッガを使用することにより、私はこのコンストラクタが呼び出されたことを考え出しました。
しかし、メモリを解放するためにmpz_clear(number)
を実行すると、構成されたBigInt
の値が間違っています。 mpz_clear(number)
を取り外すと正しい結果が得られます。私はここで何が欠けていますか?