Exception im Klassen-Destruktor
-
Hallo zusammen,
ich bekomme jedesmal eine Exception/Fehler bei folgender Klasse im Destruktor:
class Tourenplan { public: double* vorg; double* nach; int* tourid; double* saz; double* faz; double* wartezeit; double* Bedarf_der_Tour; double* anzkunden_in_tour; int Gesamtfahrstrecke; int Tourenanzahl; Tourenplan(int n) { vorg = new double[n]; nach = new double[n]; tourid = new int[n]; saz = new double[n]; faz = new double[n]; wartezeit = new double[n]; Bedarf_der_Tour = new double[n]; anzkunden_in_tour = new double[n]; for (int i=0;i<n;i++) { vorg[i] = 0; nach[i] = 0; tourid[i] = 0; saz[i] = 0; faz[i] = 0; wartezeit[i] = 0; Bedarf_der_Tour[i] = 0; anzkunden_in_tour[i] = 0; } }; ~Tourenplan() { delete[] vorg; delete[] nach; delete[] tourid; delete[] saz; delete[] faz; delete[] wartezeit; delete[] Bedarf_der_Tour; delete[] anzkunden_in_tour; }; };Der Aufruf erfolgt per:
void __fastcall TForm1::Button1Click(TObject *Sender) { int n = StrToInt(Edit1->Text); Tourenplan tp(n); //Tue etwas damit.... }Es kommt bei großem n, n > 300 zu einer "EAccessViolation" mit einem "zeigen" auf einen delete Aufruf im Destruktor.
Hoffe es kann mir geholfen werden...
Danke und Liebe Grüße
Todd
-
Hallo
Ich habe deinen Code mit Werten bis zu 40000 ausprobiert und hatte auf meinem BCB5 keine Probleme. Ich sehe auch keinen Grund für ein Problem, auch wenn ich für solche dynamischen Felder std::vector anstelle new/delete empfehlen würde.
Benutzt den Debugger und schau nach dem konkreten Absturzpunkt und wichtigen Variablenwerten.bis bald
akari
-
Hallo,
Die Klasse scheint soweit ok zu sein. Evtl. liegt es an was anderen. Es könnte ja sein, dass du schon vorher irgendwo eine Bereichsüberschreitung hast, sich das aber erst beim delete bemerkbar macht.
Kommentier doch mal den Code "//Tue etwas damit.... " raus und schau was passiert.
Vielleicht wäre es besser, wenn du statt deiner dynamischen Arrays std::vector nimmst. dann brauchst du dich um new/delete nicht mehr zu kümmern.
-
Danke für eure Antworten.
Stimmt, die Klasse ist in Ordnung. Der Fehler lag im Übergeben der erzeugten Tourenplan Instanz:
//------------------------------------------------------------------------------ #include <vcl.h> #pragma hdrstop #include "Unit1.h" //------------------------------------------------------------------------------ #pragma package(smar_init) #pragma ressource "*.dfm" TForm1 *Form1; void change_tour(Tourenplan); //------------------------------------------------------------------------------ __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //------------------------------------------------------------------------------ void __fastcall TForm1::Button1Click(TObject *Sender) { int n = StrToInt(Edit1->Text); Tourenplan = tp(n); //Tue etwas.... change_tourenplan(tp); } //------------------------------------------------------------------------------ void change_tour(Tourenplan tp) { tp.faz[0] = 2*tp.saz[2]; //EXCEPTION }tp ist ja nur innerhalb der Funktion Button1Click() sichtbar und nicht außerhalb.... ohje ohje
Danke und Liebe Grüße
Todd
-
Todd: Du solltest alle zusammengehörigen Daten in eine Unterklasse (bzw. -Struktur) stecken - und dann wie gesagt, einen std::vector benutzen.
class Tourenplan { public: Tourenplan(int n) : vTouren(n) // Erzeugung des Vektors { } // kein eigener Destruktor notwendig private: struct Tour { double vorg; double nach; int tourid; double saz; double faz; double wartezeit; double Bedarf_der_Tour; double anzkunden_in_tour; int Gesamtfahrstrecke; int Tourenanzahl; }; std::vector<Tour> vTouren; };So hast du alle Daten in einer Struktur (je Tour) stehen und brauchst nicht x Arrays zu verwalten.
-
Hallo
@ Th : Die Klasse Tour sollte aber noch im Konstruktor alle Member auf 0 setzen, so wie auch im Original.
bis bald
akari
-
Danke für eure Antworten.
Ich werde die Ideen mit std::vector und der Struktur aufgreifen und sehen wie ich damit zurecht komme.
Liebe Grüße
Todd