2016-04-20 9 views
0

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.

+0

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. –

+0

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. –

+0

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. –

Antwort

1
What is the correct way to do this? 

Sie sollten new T[] mit delete[] paaren - hier keine Magie. Um sicherzustellen, dass Sie es richtig machen, verwenden Sie std:unique_ptr<T[]> - Version für Arrays. Oder - std :: vector, aber du hast gesagt, du magst es nicht.

Why did memory consumption lowered with the first change? 

ilogical scheint, zugeordnet Sie mehr Speicher und es fallen gelassen ....

ich einen Blick auf Ihre GitHub Projekt nahm und ich fand this:

delete[] slhs, srhs;    //Deletes the now useless sorted arrays. 

löschen [] nicht list delete arrays, soweit ich mich erinnere, werden nur srhs freigegeben.Sie sollten schreiben:

delete[] srhs; 
delete[] slhs; 

andere Orte wie diese finden, oder std::unique_ptr<>

+0

Vielen Dank, ich werde dies versuchen, sobald ich etwas Zeit habe, um über diese intelligenten Zeiger zu lernen. Ich werde aktualisieren, wenn ich mit den Änderungen fertig bin. –

+0

Also habe ich beides versucht; Verwenden von 'unique_ptr' und Finden von Instanzen, bei denen' delete [] 'mit einer Liste aufgerufen wurde. Aparently habe ich den geringsten Speicherverbrauch mit 'unique_ptr', jedoch ist die Leistung nun drastisch gesunken, es dauert mehrere Male mehr, um das Programm mit denselben Parametern auszuführen. –

Verwandte Themen