new und delete
-
Oftmals liest man, daß vergessen wird,mit "new" angeforderten Speicher wieder mit
"delete" freizugeben.Könnte da nicht der Compiler behilflich sein, indem er einfach die Anzahl der "new" mit der Anzahl der "delete" vergleicht?
-
redrew99 schrieb:
Könnte da nicht der Compiler behilflich sein, indem er einfach die Anzahl der "new" mit der Anzahl der "delete" vergleicht?
Durch einfaches Zählen nicht.
void machweg(int* pi){ delete pi; } int main(){ int* pa=new int; int* pb=new int; machweg(pa); machweg(pb); }
-
Ja, der Compiler kann dir da behilflich sein, aber nicht durch zählen. Schließlich könnte man so etwas haben:
vector<int*> foo; foo.push_back(new int(5)); foo.push_back(new int(7)); for(size_t i=0; i<foo.size(); ++i) delete foo[i]; foo.clear();Was du suchst ist:
Google: RAII
Das lässt sich auch auf alle anderen Arten von Ressourcen anwenden, nicht nur Speicher. Das machen beispielsweise die Dateistreams der Standardbibliothek mit den Datei-Handles.edit: Mal wieder zu langsam...
-
ist auch gar net gewollt. dann löscht der dir vllt objekte die du noch brauchst...
bedenke, warum ein compiler dir nur deine fehler anstreicht, sie aber nicht selbst entfernt (was sehr oft durchaus möglich wäre, wie z.b. bei vergessenen punkten, kommas, oder semikolons)
-
Skym0sh0 schrieb:
ist auch gar net gewollt. dann löscht der dir vllt objekte die du noch brauchst...
bedenke, warum ein compiler dir nur deine fehler anstreicht, sie aber nicht selbst entfernt (was sehr oft durchaus möglich wäre, wie z.b. bei vergessenen punkten, kommas, oder semikolons)
Er meinte behilflich im Sinne von Warnings ausschmeissen und nicht, dass der Compiler selbst ein delete einfügt.
-
mh hab ich nirgens gelesen, dass er nur eine aufmerksamkeit möchte...
-
redrew99 schrieb:
Oftmals liest man, daß vergessen wird,mit "new" angeforderten Speicher wieder mit "delete" freizugeben.
Wer sich mit RAII beschäftigt, dem wird das selten passieren.
redrew99 schrieb:
Könnte da nicht der Compiler behilflich sein, indem er einfach die Anzahl der "new" mit der Anzahl der "delete" vergleicht?
In einigen Fällen ist die automatische Freigabe nicht die optimale Wahl (was in Sprachen mit GC zu Konstrukten wie Dispose-Schnittstellen etc. führt). Man kann darüber streiten ob es sinnvoll ist oder nicht, in C++ ziehe ich aber RAII vor.