Autor |
Beitrag |
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Do 24.03.16 18:41
Ein freundliches Hallo an alle,
ich habe folgende Frage: Wenn ich ein Klasse anlege wie z.B.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| type T_Struc = class public V1 : Integer; V2 : Integer; V3 : Integer; ... |
reserviert dann der Compiler den benötigten Speicher oder muß ich ihn per "AllocMem" zuweisen?
Zum Verständniss: Wann Stellt der Compiler den Speicher bereit und wann muß ich das selbst machen?
Grüße von der Nordsee
Peter Moderiert von Christian S.: Topic aus Sonstiges (Delphi) verschoben am Do 24.03.2016 um 18:35
|
|
jaenicke
Beiträge: 19284
Erhaltene Danke: 1742
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 24.03.16 19:04
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var Test: TStruc; begin Test := TStruc.Create; try finally Test.Free; end; end; | // Edit:
Unterstriche in Typbezeichnern sind in Delphi verpönt, deshalb habe ich TStruc geschrieben, ich überlese die einfach.
|
|
Delphi-Laie
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Do 24.03.16 21:44
Peter18 hat folgendes geschrieben : | Ein freundliches Hallo an alle,
ich habe folgende Frage: Wenn ich ein Klasse anlege [...] reserviert dann der Compiler den benötigten Speicher oder muß ich ihn per "AllocMem" zuweisen?
Zum Verständniss: Wann Stellt der Compiler den Speicher bereit und wann muß ich das selbst machen? |
Weder noch. Klassen sind Typen. Für simple Typen wird kein Speicher benötigt, nur für deren Variablen. Bei methodenhaltigen Klassen bin ich mir in dieser Hinsicht nicht ganz sicher, da diese ja Ausführungscode beinhalten, der dynamisch bereitstehen muß und nach der Instanzerzeugung auch prinzipiell ausgeführbar ist. Den erforderlichen Speicher stellt dann aber nicht mehr der Compiler bereit, sondern den fordert das Programm zur Laufzeit eben selbständig (!) an.
|
|
GuaAck
Beiträge: 378
Erhaltene Danke: 32
Windows 8.1
Delphi 10.4 Comm. Edition
|
Verfasst: Do 24.03.16 22:15
Eine Klasse ist nur eien Art TYPE. Zur Laufzeit muss dann das CREATE folgen:(MeineStruKtur := TStruct.Create;) Damit wird alles eingerichtet und auch der Speicher reserviert. Nach Abschluss sollte dann mit MeineStruct.Free alles aufgeräumt und der Speicher freigegeben werden.
Gruß
GuaAck
|
|
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Fr 25.03.16 13:38
Hallo Sebastian, hallo Delphi-Laie, hallo GuaAck,
Dank Euch für Eure Antworten. OK, etwas unpräzise formuliert. Muß ich in bestimmten Fällen im Constructor Speicher per "AllocMem" bereitstellen, oder erledigt das der Compiler von sich aus?
Wenn ich Euch richtig verstanden habe sollte Speicher automatisch durch Create bereitgestellt werden. Ist "AllocMem" dann nur im Zusammenhang mit der API notwendig, oder gibt es noch andere Fälle bei denen man selbst Hand anlegen muß?
Grüße von der verregneten Nordsee
Peter
|
|
jaenicke
Beiträge: 19284
Erhaltene Danke: 1742
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 25.03.16 14:55
Peter18 hat folgendes geschrieben : | Muß ich in bestimmten Fällen im Constructor Speicher per "AllocMem" bereitstellen, oder erledigt das der Compiler von sich aus? |
In aller Regel brauchst du das nicht manuell zu machen. Wenn du rein mit Klassen und deren privaten Feldern arbeitest, und das auch Standard-Typen wie Integer, String oder auch weitere Klassen sind, solltest du das nie brauchen.
|
|
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Fr 25.03.16 15:15
Hallo Sebastian,
Dank Dir nochmals. Das hilft schon weiter. Nun kann ich ja beruhigt an meinen Klassen stricken, ohne befürchten zu müssen, dass es seltsame Effekte gibt.
Grüße von der Nordsee
Peter
|
|
GuaAck
Beiträge: 378
Erhaltene Danke: 32
Windows 8.1
Delphi 10.4 Comm. Edition
|
Verfasst: Fr 25.03.16 17:29
Hallo Peter18,
ich habe bisher AllocMem nur ein einziges Mal gebraucht, und zwar bei folgender Konstruktion:
PROCEDURE Bearbeite_Feld(Pointer_auf_ein_Feld: TPointer; Anzahl_Elemente: integer);
Wenn man jetzt in der Procedure eine Kopie des Feldes braucht, dann muss man sich um den Speicher selbst mit AllocMem kümmen; es ist ja weder zur Compilezeit noch zur Laufzeit erkennbar, dass der zweite Parameter den Speicherbedarf bestimmt und zusätzlich gibt es keine Angabe zur Größe der Feldelemente.
ABER: Das angegebene Beispiel ist fehleranfällig und änderungsunfreundlich, deshalb macht man so was nur, wenn es wirklich nicht anders geht.
Gruß
GuaAck
|
|
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Fr 25.03.16 17:54
Hallo GuaAck,
nochmals Dank für Deine Antwort! Delphi macht ja eine Menge selbst, aber manchmal eben dich nicht, daher die Frage.
Bevor ich mir Effekte wie bei TCP/IP einhandle frage ich lieber mal nach. Dort habe ich in einem Testprogramm den Fall, das der Server manchmal als Clientname "Local host" erhält, statt den Namen des Clients. Ich vermute dort auch so einen Fall. Damit muß ich mich noch mal befassen, wenn das in mein Projekt eingefügt wird. (Die Api ist in meinem Delphi nicht drin, da mußte ich selbst ran.)
Grüße von der Nordsee
Peter
|
|