| 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:
 
 | typeT_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
 PeterModeriert von  Christian S.: Topic aus Sonstiges (Delphi) verschoben am Do 24.03.2016 um 18:35 | 
|  | 
| jaenicke 
          Beiträge: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, 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: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, 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
 | 
|  |