0

私はgnumpで作業しており、返さなければならない関数がありmpz_tます。したがって、生のポインターを使用して値を返す必要があります。newポインター用にスペースを割り当て、関数のパラメーターとして送信します。

スマートポインターを使用する方が良いと思います。しかし、私は以前に彼らと一緒に仕事をしたことはありませんでした。shared_ptrマニュアルを読みましたが、関数から変数を返すために適切に使用する方法をまだ理解できません。

shared_ptr<mpz_t> func()
{
    mpz_t z;
    mpz_init_set_str(z, "23423423423", 10);

    shared_ptr<mpz_t> p /* Shall I allocate space with "new" or smth else?.. */

    return p;
}

どんな例でも感謝します。

4

3 に答える 3

6

このコンテキストで共有ポインタを使用しても役に立ちません。型 mpz_t 自体はポインターに似ています。このようなポインターは、mpz_init_... 関数のいずれかを呼び出すことによって初期化されます。ただし、使用した init 関数によって割り当てられたスペースを解放するには、mpz_clear を呼び出す必要があります。

ポインターのようなものを shared_ptr に格納しても、必要な効果はありません。mpz_t 変数への参照数を追跡し、参照がなくなると mpz_t 変数を削除します。ただし、それはポインターのような mpz_t 変数自体を解放するだけです。mpz_clear 関数は呼び出しません。

スマート ポインターは非常に便利ですが、ポインターのような変数ではなく、クラス オブジェクトを参照するためのものです。参照するオブジェクトの破棄を処理します。複雑なオブジェクトを参照する場合は意味がありますが、ポインターを参照する場合は意味がありません。

GNU MP は C++ クラス インターフェイスを提供します。(mpz_class を探します)

shared_ptr<mpz_class> func()
{
  shared_ptr<mpz_class> z(new mpz_class("23423423423", 10));
  return z;
}

mpz_t を他の関数に渡す必要がある場合は、共有ポインターから取得できます。

p->get_mpz_t()

ここで、p は shared_ptr<mpz_class> 型です。

于 2010-10-25T22:27:57.073 に答える
1

ポインタ型が必要ですが、スマート ポインタによって呼び出されるカスタム デリータを作成できます。ポインターではなく mpz_t を使用し、破壊時に mpz_clear を使用する場合は、ポインターを期待する shared_ptr を直接使用することはできませんが、ラッパーを作成してそれを行うか、自分で実装することもできます。

あるいは、はるかに望ましいのは、mpz_t ではなく mpz_class を使用する GNU の C++ インターフェイスの使用を実際に検討することで、クリーンアップを処理してくれると思います。

于 2010-10-26T00:14:14.343 に答える
1

コピーせずに z を返したい場合は、次のようになります


shared_ptr func()
{
    shared_ptr z(new mpz_t());
    mpz_init_set_str(*z, "23423423423", 10);

    return z;
}
于 2010-10-25T21:43:45.343 に答える