STL-Zuweisungen sind Objekte, die die Logik und Schnittstelle für die Zu- und Abordnung von Arbeitsspeicher für STL-Container kapseln. Es handelt sich um Vorlagen, die einen Typparameter akzeptieren, der den Typ der Elemente angibt, die die Zuweisung verarbeiten kann. Zuweisungen stellen Methoden wie "Zuordnen", "Zuordnung", "Konstruieren" und "Zerstören" bereit, die von den Containern zum Verwalten ihrer Elemente verwendet werden. Zuweisungen definieren auch einige Typen und Konstanten, z. B. Zeiger, Größe_Typ und max_size, die von den Containern für die Interaktion mit dem Zuweisungstool verwendet werden.
C++11-Smart-Zeiger sind Klassen, die unformatierte Zeiger umschließen und eine automatische Speicherverwaltung bereitstellen. Es handelt sich um Vorlagen, die einen Typparameter akzeptieren, der den Typ des Objekts angibt, auf das der Zeiger zeigt. Intelligente Zeiger implementieren die RAII (Ressourcenbeschaffung ist Initialisierung) -Idiom, was bedeutet, dass sie eine Ressource in ihrem Konstruktor abrufen und in ihrem Destruktor freigeben. Intelligente Zeiger überladen auch Operatoren wie *, ->, und =, die es ihnen ermöglichen, sich wie rohe Zeiger zu verhalten. Es gibt drei Haupttypen von intelligenten Zeigern in C ++ 11: einzigartig_ptr, gemeinsam genutzt_ptr und schwach_ptr.
STL-Zuweisungen und C++11-Smart-Zeiger unterscheiden sich in mehrfacher Hinsicht. Erstens haben sie unterschiedliche Zwecke und Bereiche. Zuweisungen sollen von STL-Containern verwendet werden, um Speicher für ihre Elemente zuzuweisen und freizugeben, während intelligente Zeiger von Programmierern verwendet werden sollen, um die Lebensdauer einzelner Objekte zu verwalten. Zuweisungen werden in der Regel vor dem Benutzer verborgen, während intelligente Zeiger explizit deklariert und bearbeitet werden. Zweitens haben sie unterschiedliche Schnittstellen und Semantiken. Zuweisungen stellen Low-Level-Methoden bereit, die mit unformatiertem Speicher arbeiten, während intelligente Zeiger High-Level-Methoden bereitstellen, die mit Objekten arbeiten. Zuweisungen verfolgen nicht den Besitz oder die Verweisanzahl des von ihnen zugewiesenen Speichers, während intelligente Zeiger dies tun. Zuweisungen können vom Benutzer angepasst und ersetzt werden, während intelligente Zeiger durch den Standard vordefiniert und festgelegt sind.
STL-Zuweisungen und C++11-Smart-Zeiger ähneln sich in gewisser Weise. Erstens verwenden beide Vorlagen, um Generizität und Typsicherheit zu erreichen. Beide verwenden einen Typparameter, der den Typ des Arbeitsspeichers oder Objekts angibt, den sie verarbeiten, und beide erzwingen Kompilierzeitüberprüfungen und Typkonvertierungen. Zweitens verwenden beide RAII, um eine ordnungsgemäße Speicherverwaltung zu gewährleisten. Beide erwerben Speicher in ihren Konstruktoren und geben ihn in ihren Destruktoren frei, wodurch Speicherverluste und baumelnde Zeiger vermieden werden. Drittens unterstützen beide die Bewegungssemantik, die es ihnen ermöglicht, Eigentum und Ressourcen zu übertragen, ohne sie zu kopieren oder zu zerstören. Beide implementieren Move-Konstruktoren und Move-Zuweisungsoperatoren, die effizienten und ausdrucksstarken Code ermöglichen.
STL-Zuweisungen und intelligente C++11-Zeiger sind in verschiedenen Szenarien und Kontexten nützlich. Sie sollten STL-Zuweisungen verwenden, wenn Sie die Speicherzuordnungs- und -freigabestrategie für STL-Container anpassen oder optimieren müssen. Sie können z. B. eine benutzerdefinierte Zuweisung verwenden, um Arbeitsspeicher aus einem Pool, einem Stack, einem gemeinsam genutzten Speichersegment oder einer Speicherabbilddatei zuzuweisen. Sie können auch eine benutzerdefinierte Zuweisung verwenden, um Debug- oder Profilerstellungsfeatures zu implementieren, z. B. das Nachverfolgen der Speicherauslastung oder das Erkennen von Speicherfehlern. Sie sollten intelligente C++11-Zeiger verwenden, wenn Sie die Lebensdauer und den Besitz einzelner Objekte verwalten müssen, die nicht in STL-Containern gespeichert sind. Sie können z. B. eine eindeutige_PTR, um den exklusiven Besitz eines dynamisch zugewiesenen Objekts, eines gemeinsam genutzten Objekts, auszudrücken_PTR, um den gemeinsamen Besitz eines dynamisch zugewiesenen Objekts oder eines schwachen Objekts auszudrücken_PTR, um nicht besitzende Verweise auf ein gemeinsam genutztes Objekt auszudrücken.
STL-Zuweisungen und intelligente C++11-Zeiger können zusammenarbeiten, um eine flexiblere und robustere Speicherverwaltung zu erreichen. Sie können STL-Container mit benutzerdefinierten Zuweisungen verwenden, um intelligente Zeiger als Elemente zu speichern, wodurch Sie sowohl die Zuordnung als auch die Zuordnung des Containers und seiner Elemente steuern können. Sie können auch intelligente Zeiger mit benutzerdefinierten Löschern verwenden, um Zeiger auf Objekte zu speichern, die von STL-Zuweisungen zugeordnet werden, wodurch Sie RAII und Polymorphismus mit von Zuweisungen verwalteten Objekten verwenden können. Sie sollten jedoch darauf achten, dass Sie nicht verschiedene Zuweisungen oder intelligente Zeiger mit inkompatiblen Typen oder Semantiken mischen, was zu undefiniertem Verhalten oder Speicherfehlern führen kann.