Ich mache ein Werkzeug zu lösen this obwohl ich massiv durch den Code selbst abgelenkt wurde.Löschen eines Arrays erstellt von einer Funktion
An verschiedenen Stellen habe ich Funktionen, die (Zeiger auf) Arrays zurückgeben. In den meisten Fällen sind diese Funktionen rekursiv und das im inneren Aufruf erstellte Array kann später nutzlos sein.
Ich habe versucht, delete[]
zu verwenden; Obwohl der Compiler sich nicht beschwert hat und das Programm gut lief, konnte ich sehen, dass eine riesige Menge an Speicher zugewiesen wurde. Der Code sah etwa so aus: (oder gar nichts)
template <typename Type> Type* foo(unsigned short size,...)
{
//...
Type *tmp;
//...
tmp=foo(param,...);
//...
delete[] tmp;
//...
}
Ich fragte mich dann, ob, wenn die Anordnung außerhalb des Bereichs erstellt wurde, delete[]
tatsächlich gelöscht alle zugewiesenen Speicher oder nur den ersten Index.
schrieb ich dieses Stück Code wie folgt aussehen:
template <typename Type> Type* foo(unsigned short size,...)
{
//...
Type *tmp;
//..
tmp = new Type[i];
tmp = foo(param,...);
//...
delete[] tmp;
//...
}
Speicherverbrauch gesenkt, aber ich wurde schnell klar, dass das Array erstellt ich vor gerade foo(...)
Aufruf wurde nicht gelöscht ... eh und je.
So schließlich habe ich versucht:
template <typename Type> Type* foo(unsigned short size,...)
{
//...
Type *tmp, *dump;
//..
dump = tmp = new Type[i];
tmp = foo(param,...);
delete[] dump;
//...
delete[] tmp;
//...
}
Aber ich bewegte sich nur die Frage einen Schritt weiter, und in den Prozess noch ein weiteres Array erstellen. Nicht überraschend (obwohl nicht wirklich) Speicherverbrauch explodierte.
Fragen sind hier:
- Wie kann ich dieses Problem lösen?
- Warum ist der Speicherverbrauch bei der ersten Änderung gesunken?
Ich will nicht wirklich std::vector
verwenden, da scheint alle relevanten Code umschreiben wie eine große Aufgabe, und da, als Rookie, ich irgendwie das Gefühl, besser zu wissen, dass ich nicht eine Bibliothek Hilfe benötigen habe zu schreiben mein Programm (natürlich benutze ich sie immer noch; ich kann mir nicht vorstellen, was zum Schreiben von etwas wie <iostream>
zum Beispiel geht).
PS: Mein Code auf GitHub.
PPS: Ich entschuldige mich für mein Englisch; kein Muttersprachler.
verwenden Wenn Sie Speicher zuweisen mit 'new' Sie es mit' delete' befreien, und wenn Sie zuteilen mit 'new []' dann frei mit 'delete []' (und wenn Sie eine alte C-Funktion haben, die mit 'malloc' oder' calloc' verknüpft, dann benutzen Sie 'free'). Wann und wo die Zuteilung stattfindet, spielt keine Rolle. –
Es gibt auch eine einfachere Lösung für Ihr Problem, die das ganze Problem erschweren wird: ['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector). Wann immer Sie "dynamisches Array" oder "Runtime allocated array" oder etwas Ähnliches denken, sollten Sie als nächstes immer ['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector) denken. –
Ich könnte 'std :: vector' verwenden, tatsächlich benutze ich es bereits, weil das Programm selbst die Größe bestimmter Arrays berechnet, und die Verwendung der nativen stattdessen würde mich eine ganze Reihe von Code zweimal ausführen lassen; zuerst die Größe berechnen und dann die Daten ausfüllen. –