Richtig. Genau darum gehts. Und genau das ist in Java nicht der Fall. Ich muss manuell irgendwas closen.
kaum != gar nichts
Wo du etwas per Hand schreiben musst, können Fehler passieren. Immer.
Boah ey, Junge. Du hast echt nichts verstanden. Du bist der Realität gegenüber so ignorant, dass du dir einredest, C++ sei immer noch eine Erweiterung von C. Es ist mehr als das. Die Sprachen haben sich auseinanderentwickelt. In C musst du alles manuell aufräumen, also immer schön die Finger still halten, was das betrifft.
So 'n Blödsinn. Wenn du eine OS-API wrappst, schreibst du dir eine kleine Klasse, die im Destruktor ein close(handle) oder etwas vergleichbares macht, das wars dann auch schon. Dieses Konzept lässt sich auf jede beliebige Resource übertragen. Der Aufwand ist minimal.
Das macht alles RAII für mich.
Tausende Fliegen können nicht irren, schon klar. Warum verweigerst du dich eigentlich der Realität und behauptest, man müsse so extrem viel mit Resourcen hantieren? In C++ ist der vom Java-Basher erwähnte unique_ptr die Lösung für die meisten Fälle. Meist sind Besitzverhältnisse so klar, dass man nicht lange darüber nachdenken muss, wo und wann irgendwas freigegeben werden muss.
Was der Java-Basher nicht weiß: Man kann mit unique_ptr auch jede beliebige Art von Resource verwalten, indem man einen sog. "Deleter" angibt, also eine Funktion, die bei Freigabe aufgerufen werden soll.
Weil du kein modernes C++ kennst. Modernes C++ besteht nicht aus irgendwelchen Zeigerfrickeleien, Resource-Frickeleien oder ähnliches, wie ich sie immer wieder von naiven Programmierern hören muss. Es gibt da so ein schönes Sprichwort, es fängt an mit: Wenn man keine Ahnung hat, ...
Richtig, Refcounts haben ihre Probleme. Aber 1) sind Besitzverhältnisse in 99,9% der Fälle so klar, dass ein GC die langsame, inperformante und unnötige Wahl ist und 2) Wird selbst der GC irgendwann feststellen, dass ein Objekt nicht mehr gebraucht wird und kann dann eine entsprechende Freigabemethode aufrufen.
Nicht unbedingt. Es hat sich in C++ die Konvention durchgesetzt, in Destruktoren nichts zu werfen. Wenn man über einen solchen Fehler informiert werden möchte, ruft man explizit eine .close() Methode auf, die etwas wirft oder ein Fehlerflag setzt.
Das ist dann aber immer noch nur ein einziges mal, nämlich genau dann, wenn ich den Destruktor implementiere. Besser, als bei jeder Verwendung der Klasse einen try-catch Block um das close zu brauchen. Absolut lächerlich.