可能有很多原因。要列出其中一些:
- 智能指针刚刚成为标准的一部分。直到那时他们才是其他图书馆的一部分
- 它们的主要用途是避免内存泄漏。许多库没有自己的内存管理;通常,它们提供实用程序和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
}