Sie möchten gerne manuell Speicher freigeben, Dateien schließen, solche Dinge? In diesem Fall würde ich das Minimum und normalerweise weniger als die meisten anderen Sprachen angeben, die ich verwendet habe, insbesondere wenn wir dies nicht nur auf "Speicherverwaltung", sondern auf "Ressourcenverwaltung" verallgemeinern. In diesem Sinne glaube ich, dass C ++ weniger manuelle Ressourcenverwaltung erfordert als beispielsweise Java oder C #.
Dies ist hauptsächlich auf Destruktoren zurückzuführen, die das Zerstören der Ressource (Speicher oder auf andere Weise) automatisieren. Normalerweise muss ich eine Ressource in C ++ nur dann manuell freigeben / zerstören, wenn ich eine Datenstruktur auf Vlow-Ebene implementiere (was die meisten Leute nicht tun müssen) oder eine C-API verwende, in der ich nur ein wenig Zeit verbringe Umhüllen der C-Ressource, die manuell freigegeben / zerstört / geschlossen werden muss, in einen RAII-konformen C ++ - Wrapper.
Wenn ein Benutzer ein Bild in einer Bildbearbeitungssoftware schließen möchte, muss ich das Bild natürlich aus einer Sammlung entfernen. Aber hoffentlich zählt das nicht als "Speicher" - oder "Ressourcen" -Verwaltung, wie es in diesem Zusammenhang von Bedeutung ist, da dies in jeder Sprache so ziemlich erforderlich ist, wenn Sie den Speicher freigeben möchten, der zu diesem Zeitpunkt mit diesem Bild verknüpft ist. Aber alles, was Sie tun müssen, ist, das Bild aus der Sammlung zu entfernen, und der Bildzerstörer kümmert sich um den Rest.
Wenn ich es mit Java oder C # vergleiche, muss man häufig Dateien manuell schließen, Sockets manuell trennen, Objektreferenzen auf null setzen, damit sie vom Müll gesammelt werden können, usw. Es gibt viel mehr manuellen Speicher und Ressourcenverwaltung in diesen Sprachen, wenn Sie mich fragen. In C ++ müssen Sie häufig nicht einmal unlock
manuell einen Mutex erstellen, da der Mutex-Locker dies automatisch für Sie erledigt, wenn der Mutex den Gültigkeitsbereich verlässt. Zum Beispiel sollten Sie in C ++ niemals so etwas tun müssen:
System.IO.StreamReader file = new System.IO.StreamReader(path);
try
{
file.ReadBlock(buffer, index, buffer.Length);
}
catch (System.IO.IOException e)
{
...
}
finally
{
if (file != null)
file.Close();
}
Es ist nicht erforderlich, Dateien in C ++ manuell zu schließen. Sie schließen sich automatisch, sobald sie den Gültigkeitsbereich verlassen, unabhängig davon, ob sie das Ergebnis oder normale oder außergewöhnliche Ausführungspfade sind. Ähnliches gilt für speicherbezogene Ressourcen wie std::vector
. Ein solcher Code wie file.Close()
oben wird oft missbilligt, da er insbesondere im Zusammenhang mit einem finally
Block darauf hindeutet, dass die lokale Ressource manuell freigegeben werden muss, wenn die gesamte Denkweise in C ++ dies automatisieren soll.
In Bezug auf die manuelle Speicherverwaltung würde ich sagen, dass C das Maximum, Java / C # eine mittlere Menge und C ++ das Minimum von diesen erfordert. Es gibt viele Gründe, etwas schüchtern mit C ++ umzugehen, da es eine sehr schwierig zu beherrschende Sprache ist, aber die Speicherverwaltung sollte keine davon sein. Im Gegenteil, ich denke tatsächlich, dass es in dieser Hinsicht eine der einfachsten Sprachen überhaupt ist.
Natürlich können Sie in C ++ den Speicher manuell zuweisen und aufrufen operator delete/delete[]
, um Speicher manuell freizugeben. Sie können auch C-Funktionen wie malloc
und verwendenfree
. Aber das sind Codierungspraktiken im alten Stil, von denen ich denke, dass sie veraltet sind, lange bevor die Leute Anerkennung finden, da Stroustrup RAII befürwortet hat, bevor er den Begriff überhaupt von Anfang an geprägt hat. Ich halte es also nicht einmal für fair zu sagen, dass "modernes C ++" das Ressourcenmanagement automatisiert, weil dies eigentlich der ganze Zweck sein sollte. Sie können sonst praktisch keine Ausnahmesicherheit erhalten. Es ist nur so, dass viele fehlgeleitete Entwickler in den frühen 90ern versucht haben, C ++ wie C mit Objekten zu verwenden, und dabei die Ausnahmebehandlung oft völlig ignoriert haben, und es sollte nie so verwendet werden. Wenn Sie C ++ so verwenden, wie es eigentlich immer beabsichtigt war, dann ist die Speicherverwaltung vollständig automatisiert und im Allgemeinen nicht etwas, mit dem Sie manuell zu tun haben (oder mit dem Sie zu tun haben sollten).