Speicher allocieren
-
Hallo,
ich möchte ein Array von TEdit ObjektPointer anlegen.
Im Header mache ich folgendes
TEdit *ModulValues[500];
Im Konstruktor
ModulValues = new TEdit(this); //Kommt natürlich eine Fehlermeldung.
also lasse ich es weg.Im Header wurde ja schon ein TEdit Array Instanziert aber kein
Speicher allociert was ein Problem ist.Wie kann ich mit new für ein TEdit Array speicher allocieren?
ModulValues = new TEdit[100] ??;
-
Hallo
Du erstellst ein festes Array von Zeigern auf TEdit, da brauchst du kein new um das Array selber zu erstellen.
Wenn du ein dynamisches Array haben willst dann must du das so dekalrierenTEdit **ModulValues;, dann kannst du auch new verwenden.
Aber du solltest statt desen lieber std::vector nehmen.Siehe auch in der FAQ hier im BCB-Forum, Abschnitt Komponenten benutzen.
bis bald
akari
-
akari schrieb:
Aber du solltest statt desen lieber std::vector nehmen.
Denke mal werde std::vector nehmen.
Danke Dir.
-
akari schrieb:
Hallo
Du erstellst ein festes Array von Zeigern auf TEdit, da brauchst du kein new um das Array selber zu erstellen.
akariWenn ich im Header eine Array Instanz[500] erzeuge, habe ich doch noch keinen Speicher (beim Betriebssysystem) allociert oder sehe ich das falsch? (physikalisch existiert der Speicher allerdings doch
schon?!), da sonst mein Prog nicht laufen würde.Erst mit <maloc> oder <new> wird (beim Betriebssysystem) Speicher allociert, oder sehe ich das falsch?
-
Hallo
Zunächst einmal muß man nicht malloc oder new einsetzen um Speicher zu reservieren. Denn schon ein einfaches int x; reserviert (auf 32 bit) 4 Byte Speicher auf dem Stack. Um die Verwaltung dieses Speichern brauchst du dir keinen gedanken zu machen, das übernimmt der Compiler für dich (siehe Gültigkeit von Stack-Variablen).
Mit new und malloc hingegen reservierst du manuell Speicher auf dem Heap. Der Vorteil ist : der Heap ist viel größer als der Stack und du bestimmst selber wie lange du den Speicher brauchst. Der Nachteil ist du must selber den Speicher wieder freigeben, und du must auch aufpassen das du wirklich auf reservierten Speicher zugreifst.
Das ist bei Arrays nicht anders. ein statisches C-Array legt seine Elemente im Stack ab. Das heißt bei int x[10] werden 10 Elemente auf dem Stack angelegt, der Speicher wird automatisch verwaltet. Bei TEdit x[10]* wird genau deselbe gemacht : es wird automatisch der Sepicher von 10 Pointern auf TEdit verwaltet. Wichtig ist aber das damit aber nicht Speicher für die Edit-Instanzen selber verwaltet wird... die Instanzen müßen manuell zugewiesen und verwaltet werden.
Auch Array kannst du mit malloc und new auf dem Heap anlegen.Ich hoffe deine Frage ist beantwortet. Wenn nicht dann mnach bitte einen neuen Thread im C++ Forum auf, denn mit dem Builder hat das im speziellen nichts mehr zu tun.
bis bald
akari
-
Hallo,
ich glaube du verwechselst da etwas.
Wenn du im Header Klasse eine Membervariable anlegst, zB. int a[50] dann wird automatisch der Speicher statisch hierfür reserviert.
Der Zugriff vom Index 0 - 49 ist somit möglich.Wenn du allerdings ein Array von Pointern anlegst TEdit *ModulValues[500], dann hast du ein Array von 500 nicht initialisierten Pointern angelegt. Die der Speicher für die einzelnen Pointern ist jedoch schon allokiert.
Du müsstes nun noch zB. folgendes machen:
for(int i = 0; i < 500; i++) { TEdit[i] = new TEdit(this); ... ... }Schau mal in der FAQ, dort gibts ein beispiel zum dynamischen erstellen von VCL Komponenten.
Venn du es mit einem vector machst ist es aber einfacher (das dynamische verwalten). Du musst aber trotzdem noch jeden Pointer wie oben initialisieren.Ich hoffe ich sage da nichts falsches

[EDIT] Da war jemand schneller
