Es kann viele Gründe geben. Um einige davon aufzulisten:
- Intelligente Zeiger wurden erst kürzlich zum Standard. Bis dahin waren sie Teil anderer Bibliotheken
- Ihre Hauptanwendung besteht darin, Speicherlecks zu vermeiden. Viele Bibliotheken haben keine eigene Speicherverwaltung. Im Allgemeinen bieten sie Dienstprogramme und APIs
- Sie werden als Wrapper implementiert, da sie tatsächlich Objekte und keine Zeiger sind. Was im Vergleich zu Rohzeigern zusätzliche Zeit- / Raumkosten verursacht; Die Benutzer der Bibliotheken möchten möglicherweise keinen solchen Overhead haben
Bearbeiten : Die Verwendung von intelligenten Zeigern liegt ganz beim Entwickler. Es hängt von verschiedenen Faktoren ab.
In leistungskritischen Systemen möchten Sie möglicherweise keine intelligenten Zeiger verwenden, die Overhead generieren
Für das Projekt, das die Abwärtskompatibilität benötigt, möchten Sie möglicherweise nicht die intelligenten Zeiger verwenden, die über C ++ 11-spezifische Funktionen verfügen
Bearbeiten2 Es gibt eine Reihe von Abstimmungen innerhalb von 24 Stunden, da die Passage unten liegt. Ich verstehe nicht, warum die Antwort abgelehnt wird, obwohl unten nur ein Zusatzvorschlag und keine Antwort angegeben ist.
Mit C ++ können Sie jedoch immer die Optionen öffnen. :) z.B
template<typename T>
struct Pointer {
#ifdef <Cpp11>
typedef std::unique_ptr<T> type;
#else
typedef T* type;
#endif
};
Und in Ihrem Code verwenden Sie es als:
Pointer<int>::type p;
Für diejenigen, die sagen, dass ein intelligenter Zeiger und ein roher Zeiger unterschiedlich sind, stimme ich dem zu. Der obige Code war nur eine Idee, wo man einen Code schreiben kann, der nur mit a austauschbar #define
ist. Dies ist kein Zwang .
Muss beispielsweise T*
explizit gelöscht werden, ein Smart Pointer jedoch nicht. Wir können eine Vorlage haben, Destroy()
um damit umzugehen.
template<typename T>
void Destroy (T* p)
{
delete p;
}
template<typename T>
void Destroy (std::unique_ptr<T> p)
{
// do nothing
}
und benutze es als:
Destroy(p);
Auf die gleiche Weise können wir einen Rohzeiger direkt kopieren und für einen intelligenten Zeiger eine spezielle Operation verwenden.
Pointer<X>::type p = new X;
Pointer<X>::type p2(Assign(p));
Wo Assign()
ist wie:
template<typename T>
T* Assign (T *p)
{
return p;
}
template<typename T>
... Assign (SmartPointer<T> &p)
{
// use move sematics or whateve appropriate
}