Speicherfehler( delete[]/ new)
-
Hallo,
ich schreibe im Moment ein kleines Programm und habe ein Speicherfehler beim freigeben von meinem Speicher!?
Ich mache folgendes:myclass::myclass{ float** points; points = new float* [2]; points[0]= new float [ANZAHL]; points[1]= new float [ANZAHL]; //........... } myclass::~myclass{ delete[] points[0]; delete[] points[1]; delete points; //............. } //.............. void myclass::methode(){ delete[] points[0]; delete[] points[1]; points[0]= new float [NEUE_ANZAHL]; points[1]= new float [NEUE_ANZAHL]; return; }Der Speicherfehler tritt beim aufrufen von methode auf und zwar beim delete[] points[0];.
Ich habe keinen Plan warum es dabei Probleme geben soll ?
Ich würde mich sehr über Hilfe freuen.
-
shorty0802 schrieb:
Der Speicherfehler tritt beim aufrufen von methode auf und zwar beim delete[] points[0];.
Vermutlich kopierst du irgendwo ein Objekt dieser Klasse, hast aber keinen Copykonstruktor/Zuweisungsoperator.
Am einfachsten löst du das, indem du statt new/delete std::vector verwendest. Genau dafür ist der da.
-
Und delete points; müsste doch auch delete[] points; sein.
-
Fellhuhn schrieb:
Und delete points; müsste doch auch delete[] points; sein.
Sicher? points ist doch nur ein Zeiger auf einenZeiger; beim new ist nur für einen einzigen Zeiger Speicherplatz reserviert worden, nicht für ein Array.
-
Belli schrieb:
Sicher?
Ja.
Belli schrieb:
points ist doch nur ein Zeiger auf einenZeiger; beim new ist nur für einen einzigen Zeiger Speicherplatz reserviert worden, nicht für ein Array.
Da steht new float* [2]. Aber selbst wenn da [1] stehen würde: points wurde mit new[] alloziiert, also muss es mit delete[] freigegeben werden.
-
Schei...!
Keine Ahnung, was ich da gesehen zu haben glaube! Stimmt natürlich!
-
eigendlich könntest du das äussere array auch statisch machen
alsofloat *points[2]; points[0]= new float [ANZAHL]; points[1]= new float [ANZAHL]; // ---- delete[] points[0]; delete[] points[1];so musst du dich wenigstens nicht um dadrum kümmmern, kommt halt auf dein problem an...
aber ansonsten:
class c { std::vector< std::vector<float> > points(2, std::vector<float>(ANZAHL)); // sollte so klappen wenn nicht: /* std::vector< std::vector<float> > points(2); points[0].resize(ANZAHL); points[1].resize(ANZAHL); */ };
-
Danke für die Hilfe!
Dann werd ichs wohl mit der Vector Klasse machen müssem.
Ich kopier eigentlich keine Objekte, ich fands nur komisch dass beim freigeben von Speicher was falsch laufen kann.
-
shorty0802 schrieb:
Ich kopier eigentlich keine Objekte,
Und uneigentlich? Hast du irgendwelche Funktionen, die myclass-Parameter haben? Dann wird da schon kopiert.
shorty0802 schrieb:
ich fands nur komisch dass beim freigeben von Speicher was falsch laufen kann.
Was da falsch läuft, ist vermutlich, dass du etwas freigeben willst, was bereits freigegeben wurde.
-
shorty0802 schrieb:
Ich kopier eigentlich keine Objekte
In diesem Fall solltest du den Copy-Konstruktor und den Zuweisungsoperator private machen. Falls du doch aus Versehen kopierst, wirst du so einen Compilerfehler bekommen.