多くの理由が考えられます。それらのいくつかをリストするには:
- 最近、スマートポインターが標準の一部になりました。それまでは他のライブラリの一部でした
- 主な用途は、メモリリークを回避することです。多くのライブラリには独自のメモリ管理がありません。一般に、ユーティリティと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;
スマートポインターとローポインターが異なると言う人にとっては、私はそれに同意します。上記のコードは単にと交換可能なコードを記述できるアイデアであり#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
}