Die Lebensdauer eines Objekts wird durch seinen Geltungsbereich bestimmt. Manchmal ist es jedoch notwendig oder nützlich, ein Objekt zu erstellen, das unabhängig von dem Bereich lebt, in dem es erstellt wurde. In C++ ist der Operator new
wird verwendet, um ein solches Objekt zu erstellen. Und um das Objekt zu zerstören, wird der Operator delete
verwendet werden können. Vom Operator erstellte Objekte new
werden dynamisch zugewiesen, d. h. im dynamischen Speicher (auch als Haufen ou freies Lager ). So kann ein Objekt, das von new
existiert so lange, bis sie explizit mit delete
.
Einige Fehler, die bei der Verwendung von new
y delete
sind:
- Durchgesickertes Objekt (oder Speicher): mit
new
ein Objekt zuzuweisen und zu vergessen delete
das Objekt.
- Vorzeitig löschen (oder hängender Verweis ): hält einen weiteren Zeiger auf ein Objekt,
delete
das Objekt, und verwenden Sie dann den anderen Zeiger.
- Doppeltes Löschen : Versuch einer
delete
ein Objekt zweimal.
Im Allgemeinen werden skalierte Variablen bevorzugt. RAII kann jedoch als Alternative zu new
y delete
um ein Objekt unabhängig von seinem Geltungsbereich leben zu lassen. Eine solche Technik besteht darin, den Zeiger auf das Objekt, das auf dem Heap zugewiesen wurde, in einen handle/manager object . Letzteres hat einen Destruktor, der sich um die Zerstörung des Objekts kümmert. Damit wird sichergestellt, dass das Objekt jeder Funktion zur Verfügung steht, die darauf zugreifen möchte, und dass das Objekt zerstört wird, wenn die Lebensdauer der Griffobjekt endet, ohne dass eine explizite Bereinigung erforderlich ist.
Beispiele aus der C++-Standardbibliothek, die RAII verwenden, sind std::string
y std::vector
.
Betrachten Sie dieses Stück Code:
void fn(const std::string& str)
{
std::vector<char> vec;
for (auto c : str)
vec.push_back(c);
// do something
}
Wenn Sie einen Vektor erstellen und ihm Elemente hinzufügen, müssen Sie sich nicht um die Zuweisung und Freigabe solcher Elemente kümmern. Der Vektor verwendet new
um Platz für seine Elemente auf dem Heap zuzuweisen, und delete
um diesen Platz freizugeben. Als Nutzer von vector sind Ihnen die Implementierungsdetails egal und Sie vertrauen darauf, dass vector nicht ausläuft. In diesem Fall ist der Vektor der Griffobjekt seiner Elemente.
Weitere Beispiele aus der Standardbibliothek, die RAII verwenden, sind std::shared_ptr
, std::unique_ptr
であり、また std::lock_guard
.
Ein anderer Name für diese Technik ist SBRM , kurz für Umfangsgebundenes Ressourcenmanagement .
14 Stimmen
de.wikipedia.org/wiki/Ressourcenerwerb_ist_Initialisierung
17 Stimmen
Das ist es, was es für mich ausmacht. stroustrup.com/bs_faq2.html#finally
4 Stimmen
Microsoft-Referenz mit 3 Sätzen und 2 Beispielen aber sehr übersichtlich! msdn.microsoft.com/de-us/library/hh438480.aspx