こんにちは、
スマートポインタに関するこのクエリがあります。
友人の一人から、スマートポインターはほとんどの場合生のポインターを置き換えることができると聞きました。しかし、私が彼にスマートポインターが生のポインターを置き換えることができない他のケースは何であるかを尋ねたとき、私は彼から答えを得ませんでした。
誰かが生のポインタをいつどこで置き換えることができないか教えてもらえますか?
こんにちは、
スマートポインタに関するこのクエリがあります。
友人の一人から、スマートポインターはほとんどの場合生のポインターを置き換えることができると聞きました。しかし、私が彼にスマートポインターが生のポインターを置き換えることができない他のケースは何であるかを尋ねたとき、私は彼から答えを得ませんでした。
誰かが生のポインタをいつどこで置き換えることができないか教えてもらえますか?
スマートポインタを使用できるが、使用したくない場合も多くあります。例:
Cから呼び出されるAPIは、明らかな例です。
使用するスマートポインタによって異なります。std::auto_ptrはSTLコンテナと互換性がありません。
それはセマンティクスの問題です:
例えば:
class FooContainer
{
public:
typedef std::vector<Foo> foos_t;
foos_t::const_iterator fooById(int id) const; // natural right ?
};
ただし、ここで実装の詳細を公開すると、独自のイテレータクラスを完全に作成できます...ただし、イテレータは通常、インクリメント可能などを意味します...またはポインタを使用します
class FooContainer
{
public:
const Foo* fooById(int id) const;
};
おそらくNULL
、失敗を示すを返すか、メモリを処理する必要のないオブジェクトへのポインタを返します。
もちろん、weak_ptr
ここで使用することもできます(メソッドを取得しますexpired
)が、shared_ptr
そもそも使用する必要があり、実装で使用しない場合があります。
レガシーコードとの相互作用。APIに生のポインターが必要な場合は、コードに一度生のポインターを入れたら、それをスマートポインターでラップする場合でも、生のポインターを提供する必要があります。
生のポインターが何らかの理由でintptr_tにキャストされて戻ってくる状況では、キャスト操作によってスマートポインターに含まれる参照カウント情報が失われるため、スマートポインターに置き換えることはできません。
ある時点でプレーンポインタを使用しない場合、スマートポインタを実装するのは非常に困難です。
スマートポインタを使用して特定のデータ構造を実装することも難しいと思います。たとえば、通常のリンクリストのメモリを解放することは非常に簡単ですが、同じ結果を得るには、所有しているスマートポインタと所有していないスマートポインタの組み合わせを理解する必要があります。