Там может быть много причин. Чтобы перечислить несколько из них:
- Умные указатели стали частью стандарта совсем недавно. До этого они были частью других библиотек.
- Их основное назначение - избежать утечек памяти; у многих библиотек нет собственного управления памятью; Как правило, они предоставляют утилиты и 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
}