2016-10-31 5 views
0

私は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)を取り外すと正しい結果が得られます。私はここで何が欠けていますか?

答えて

0

この回答を作成してコードを見て、私は間違いを見た。私はidを返すべきときにnumberを返していました。これは、変換コンストラクタが明示的である必要がある理由です。

したがって、コンストラクタはmpz_intをコピーします。しかし、それをコピーする前に私は解放していました(関数の復帰時に)。さらに私は毎回1つのmpz_tを漏らした。

関連する問題