多くの理由が考えられます。それらのいくつかをリストするには:
- スマート ポインターは、つい最近標準の一部になりました。それまでは他のライブラリの一部でした
- それらの主な用途は、メモリ リークを回避することです。多くのライブラリには独自のメモリ管理がありません。一般に、ユーティリティと API を提供します。
- これらは実際にはオブジェクトでありポインターではないため、ラッパーとして実装されます。生のポインターと比較して、追加の時間/空間コストがあります。ライブラリのユーザーは、そのようなオーバーヘッドを望んでいない場合があります。
編集: スマート ポインターの使用は、完全に開発者の選択です。それはさまざまな要因に依存します。
パフォーマンスが重要なシステムでは、オーバーヘッドを生成するスマート ポインターを使用したくない場合があります。
下位互換性が必要なプロジェクトでは、C++11 固有の機能を持つスマート ポインターを使用したくない場合があります。
Edit2以下のパッセージのため、24 時間の間にいくつかの反対票が連続して発生しています。以下は単なるアドオンの提案であり、回答ではないにもかかわらず、回答が反対票を投じられた理由を理解できません。
ただし、C++ では常にオプションを開くことが容易になります。:) 例えば
template<typename T>
struct Pointer {
#ifdef <Cpp11>
typedef std::unique_ptr<T> type;
#else
typedef T* type;
#endif
};
コードでは次のように使用します。
Pointer<int>::type p;
スマート ポインターと生のポインターは違うと言う人には、私も同意します。上記のコードは、単に a と交換可能なコードを記述できるアイデア#define
にすぎません。これは強制ではありません。
たとえば、T*
明示的に削除する必要がありますが、スマート ポインターは削除しません。それを処理するためのテンプレートを用意できますDestroy()
。
template<typename T>
void Destroy (T* p)
{
delete p;
}
template<typename T>
void Destroy (std::unique_ptr<T> p)
{
// do nothing
}
そしてそれを次のように使用します:
Destroy(p);
同様に、生のポインターの場合は直接コピーでき、スマート ポインターの場合は特別な操作を使用できます。
Pointer<X>::type p = new X;
Pointer<X>::type p2(Assign(p));
どこAssign()
にあります:
template<typename T>
T* Assign (T *p)
{
return p;
}
template<typename T>
... Assign (SmartPointer<T> &p)
{
// use move sematics or whateve appropriate
}