1

残念なことに、実際の開発でスマートポインターを使用する機会はありませんでした(監督者はそれが「複雑」で時間の無駄だと考えています)。しかし、私はそれらを自分のものに使用することを計画しました...

モジュールが完了した後、または新しいデータがロードされたときに、モジュールの初期化を解除する状況があります。ポインターを使用していると、コードに次のようなnullのチェックが散らばっています...

// TODO: Reset all opened windows

// Deinit track result player
if (trackResultPlayer_)
    trackResultPlayer_->reset();

// disconnect track result player
disconnect(trackResultPlayer_);

disconnect(trackResultAnimator_);
}

if (videoPlayerWindow_)
{
    videoPlayerWindow_->reset();

    // Disconnect the video player window from source movie data
    disconnect(videoPlayerWindow_);
}

// Disconnect this module from its children as they would be connected again
disconnect(this);

生のポインターの代わりにスマートポインターを使用する場合、この問題をどのように軽減できますか?

4

3 に答える 3

4

各クラスに、そのクラスに必要なすべてのクリーンアップ/初期化解除を実行するデストラクタを実装させます。

クラスのインスタンスを作成し、boost::shared_ptr.

次に、インスタンスへのアクセスが必要なすべての関数にそのコピーを渡します。

また、スマート ポインターは、オブジェクトが使用されなくなると (すべての共有ポインターが破棄されると)、それらが指すオブジェクトが破棄されることを保証します。そのデストラクタが実行され、すべてのクリーンアップが実行されます。

C++ では常にそうであるように、可能な限り RAII を使用してください。

x.reset()やのようなコードがあるときはいつでもdisconnect(x)、最初にすべきことは「これはデストラクタに属していないか?」と自問することです。

さらに、使用するたびに、次のx->y()ことを自問する必要があります。

  • なぜこれがポインターなのですか?スタックに割り当てられた単一のインスタンスと、おそらくそれへのいくつかの参照で間に合わせることができませんでしたか?
  • ポインターでなければならないのなら、なぜスマートポインターではないのでしょうか?
于 2009-09-22T11:05:43.110 に答える
2

スマート ポインターは、主に、ポイントされているメモリを管理する手段です。それらは、NULL値チェックの負担から解放されるようなものではありません...

videoPlayerWindow_->reset()あなたのコード例では、のような呼び出しdisconnect(videoPlayerWindow_)をクラスのデストラクタに移動しない限り、スマートポインタがコードの複雑さを軽減する可能性はあまりないと思いますvideoPlayerWindow

于 2009-09-22T10:30:10.620 に答える
2

NULL に対するチェックは問題ではありません。また、スマート ポインターはそれに干渉しません。

于 2009-09-22T10:34:58.037 に答える