Причин може бути багато. Щоб перелічити декілька з них:
- Розумні покажчики стали частиною стандарту зовсім недавно. До цього часу вони входили до складу інших бібліотек
- Основне їх використання - уникнути витоку пам'яті; багато бібліотек не мають власного управління пам’яттю; Як правило, вони надають утиліти та 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
}