3

まず、さまざまな種類のスマート ポインターがあるため、この質問ではそのうちの 2 つに焦点を当てたいと思います。参照カウントの侵入型スマート ポインターと非侵入型スマート ポインターです。質問は、ポインターの種類ごとに個別に尋ねられます。

私は自分の質問をどのように定式化するのかよくわかりません. どのタイプのスマート ポインターを何のために使用するべきか。

これが私が求めていることであり、それが十分に明確であることを願っています.「スマートに管理された」オブジェクトを扱うとき、どのコンテキストでどのポインターセマンティクスを使用する必要がありますか? つまり、スマート ポインターのセマンティクス、生のポインターのセマンティクス、その他 (スマート ポインターへの参照など) ですか?

グローバル ポインターなどのオブジェクト (参照カウント メモリ エンティティであるオブジェクト) へのポインターを "格納" する場合、またはクラス メンバーとして、それはスマート ポインターである必要があるため、所有権を主張することは明らかですが、他の状況はどうですか?

ポインターを関数の引数として渡す場合、それはスマート ポインター、生のポインター、スマート ポインターへの参照、またはその他のものである必要がありますか? 返されたポインタはどうですか? ローカルポインター?すぐ...

もちろん、どこでもスマート ポインターを使用できますが、これは最も安全なオプションですが、これは本当に不必要であり、オーバーヘッドが増えると感じています。

4

7 に答える 7

5

私見ですが、パフォーマンスをわずかに向上させるよりも、処理を高速化する方がよい場合があります。常にスマート ポインターを使用すると、処理が速くなると思います。

私の提案: どこでもスマート ポインターを使用します。次に、プロファイラーを使用して、かなりのオーバーヘッドが発生するかどうかを確認します。それがどこにあるか、それを変更してください:)

于 2009-07-13T15:09:44.180 に答える
4

スマートかどうかに関係なく、ポインターの使用を可能な限り制限することをお勧めします。あなたのバックグラウンドはわかりませんが、Java や C# などの言語から来た多くの人は、実際には値を使用して参照渡しで呼び出す必要があるときにポインターを使用します。C++ プログラムでポインターを使用することは比較的まれです。

于 2009-07-13T15:20:37.390 に答える
2

私のポインタのリスト:

  • 通常の使用法: 通常のメンバーとそれらへの (const) 参照
  • オブジェクトの共有と存続 (所有者、コンテナー): shared_ptr
  • 共有しますが、維持はしません (ユーザー): weak_ptr
  • 使用範囲: scoped_ptr
  • その他の使用法 (出力パラメーターなど): 生のポインター
于 2009-07-13T15:47:15.713 に答える
2

「スマート ポインター セマンティクス」と「生のポインター セマンティクス」を対比しようとする場合、すべての「スマート ポインター セマンティクス」をグループ化できると誤って想定しています。同意しません。との差は、 bwteeenとの差boost::scoped_ptrboost::shared_ptr同じ桁数です。boost::shared_ptrT*

オブジェクトへのポインターをクラス メンバーとして "格納" する場合、セマンティクスについてはあまり説明していません。参照されるオブジェクトが論理的にメンバー (「所有」) である場合、はい、スマート ポインターが必要です。しかし、非常に特殊なセマンティクスを持つもの: 単一の所有権。これは、他の 2 つの一般的なスマート ポインターに名前を付ける共有所有権も弱いポインターもないことを意味します。一方、エラー ログ オブジェクトへのポインターを格納する場合は、おそらく弱いポインターが必要です。これにより、シャットダウン中にクラッシュするのを防ぐことができます。ログがなくなった場合、ウィーク ポインターは NULL になります。

同様に、関数からポインターを返す場合、ケースの実際のセマンティクスによって、必要なポインターの型が決まります。関数から返されるという単純な事実ではありません。

于 2009-07-13T15:16:12.873 に答える
1

多くの場合、スマート ポインターの使用は、メモリ管理や例外処理に関連しています。STL の auto_ptr は、複雑な try/catch 環境でも破棄を適切に管理します。スマート ポインターは、ポイントされたオブジェクトのライフサイクルをスマート ポインターに委任するのに役立ちます。通常、「オブジェクトを作成した場所で破棄する」というパラダイムに従うのが難しい場合に必要です。参照型のスマート ポインターは、共有オブジェクトを簡単に管理できない場合に役立ちます。私はこの種の問題を優れたアーキテクチャで解決することを好みますが、スマート ポインターが最善の方法である場合もあります。

于 2009-07-13T15:20:44.800 に答える
0

私の経験では、オブジェクトへの参照を保存する必要のない関数にオブジェクトを渡す場合 (または、関数を呼び出してもオブジェクトの有効期間に影響を与えない場合)、安全です。オブジェクトを参照渡しします。これにより、コードがスマート ポインター型に「結び付けられる」ことが少なくなります。

一方、常にスマート ポインター型を使用することは「常に安全」なので、疑問がある場合は....

于 2009-07-13T15:14:51.613 に答える