Problem mit new und delete bei eigenem Typ
-
Hallo, ich hab im HeaderFile meiner Klasse 3 typedef struct deklariert, welche aber nicht zur klasse gehören, sonder global sind, da ich in CALLBACK Funktionen auf sie zugreifen muss. Das Problem ist, dass ich Messwerte einlese,und das Array mit jedem neuen Messwert erweitern will. Es funktioniert aber nicht, das Array bleibt immer gleich gross...Wer weiss weiter?
Deklaration der Struktur
typedef struct //Zur Speicherung der I - Regler Werte { UINT16 i_ist; UINT16 i_soll; } current;
Definition meiner Variable (Gleich unter der Deklaration des Typs, also au global):
current *I_Array;
Und nun die Funktion:
void VCI_CALLBACKATTR receive_queuedata(UINT16 que_hdl, UINT16 count, VCI_CAN_OBJ FAR *p_obj) { VCI_CAN_OBJ s_obj; int j,i, Index; char TempBuf1[30]; char TempBuf2[30]; AnsiString Message; bool Default = True; int ArraySize = sizeof(V_Array) / sizeof(V_Array[0]); //Aktueller maximaler Index speed *Temp_V_Array = new speed[ArraySize]; current *Temp_I_Array = new current[ArraySize]; pos *Temp_Pos_Array = new pos[ArraySize]; for(i=0; i<= ArraySize - 1; i++) //Werte Temp. speichern { Temp_V_Array[i] = V_Array[i]; Temp_I_Array[i] = I_Array[i]; Temp_Pos_Array[i] = Pos_Array[i]; } delete V_Array; delete I_Array; delete Pos_Array; V_Array = new speed[ArraySize + count]; //Arrays grösser machen I_Array = new current[ArraySize + count]; Pos_Array = new pos[ArraySize + count]; for(i=0; i<= ArraySize - 1; i++) //Werte zurück schreiben { V_Array[i] = Temp_V_Array[i]; I_Array[i] = Temp_I_Array[i]; Pos_Array[i] = Temp_Pos_Array[i]; } delete Temp_V_Array; delete Temp_I_Array; delete Temp_Pos_Array;
-
Schonmal im Debugger deine errechnete Arraygrösse betrachtet?
Es gibt übrigens - besser handhabbare - STL-Container für dein Problem. Oder auch nur shcon bessere Design-Pattern (z.B. Linked List)
-junix
-
junix schrieb:
Schonmal im Debugger deine errechnete Arraygrösse betrachtet?
Es gibt übrigens - besser handhabbare - STL-Container für dein Problem. Oder auch nur shcon bessere Design-Pattern (z.B. Linked List)
-junix
Ja, (Ueli), ich glaube dir gern, dass es bessere Lösungen gibt, aber das ist Teil meiner IPA und ich habe nicht genügend Zeit noch andere Wege zu finden, müsst das oben denn funktionieren? Oder ist da was flasch?
Merci Pascal
-
Da ich nirgends eine Deklaration von V_Array sehe, gehe ich davon aus, dass dies ein Zeiger ist. Ein Sizeof auf einen Zeiger ergibt immer nur genau ein einziges Resultat, nämlich 4 (32Bit, Zeigergrösse). (Das wollte ich dir eigentlich aufzeigen, indem ich dir nahegelegt hatte, du sollst mal die errechnete Arraygrösse überprüfen)
Es gibt für dich also keine Chance, mit irgend einem Operator die grösse des hinter dem Zeiger reservierten Speichers zu ermitteln, ausser du führst die Buchhaltung selber mit (umständlich). (sizeof wird zur Compile-Zeit ausgewertet)Ob nun Teil deiner IPA oder nicht, shcmeiss den Ansatz über Bord und benutz entweder ein DynamicArray (mir war, das ist Mitglied der VCL) oder z.B. ein std::vector (befrage Ron mal dazu, er hat soviel ich weiss schon damit gearbeitet). Damit trittst du das ganze Memory-Management-Geraffel an eine bereits bestehende (und funktionierende) Klasse ab und räumst dir viele Stolpersteine schonmal aus dem Weg.
Bei einem std::vector z.B. kannst du anschliessend nur mit array.push_back(wert); neue Werte zum Array hinzufügen. Wenn du unbedingt zu Fuss etwas implementieren willst, dann kannst du auch eine Linked-list implementieren (der übliche desing-pattern für die Lösung eines solchen Problems). Vergiss allerdings den Ansatz mit dem deleten und newen von Arrays...-junix
-
hi,
und da wir gerad dabei sind:
delete V_Array; delete I_Array; delete Pos_Array;
ist da nicht so toll
delete [] V_Array; delete [] I_Array; delete [] Pos_Array;
faänd ich besser. Mit den Tempdingern das selbe.
ansonsten kann ich junix nur zustimmen. Du solltest eventuell das Konzept ändern
-
Ohä, schande... das hatte ich ja ganz übersehen...
-junix
-
Merci, funktioniert ganz gut jetzt, hab einfach das Management vom Index selbst übernommen, und das ist relativ einfach, da nur in 2 Funktionen Einträge hjinzugefügt, bzw entfernt werden...
¨
Gruss Pascal
-
Äh ja, das sollte doch sowieso so sein, dass sich nur 2 Funktionen (1 welche sich um das Füllen, 1 welche sichum das Entfernen kümmert) die Arrays manipulieren? Alles andere wäre sowieso inakzeptabel.
Ahja und Andreas' Hinweis ist ausgesprochen wichtig, da du sonst Memoryleaks erzeugst.
-junix