Autor Beitrag
Peter18
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Do 24.03.16 18:41 
Ein freundliches Hallo an alle,

ich habe folgende Frage: Wenn ich ein Klasse anlege wie z.B.
ausblenden 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 user profile iconChristian S.: Topic aus Sonstiges (Delphi) verschoben am Do 24.03.2016 um 18:35
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 24.03.16 19:04 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var 
  Test: TStruc;
begin
  Test := TStruc.Create; // Hier wird der Speicher reserviert
  try
    // Benutzung von Test
  finally
    Test.Free; // Hier wird der Speicher freigegeben
  end;
end;
// Edit:
Unterstriche in Typbezeichnern sind in Delphi verpönt, deshalb habe ich TStruc geschrieben, ich überlese die einfach. ;-)
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Do 24.03.16 21:44 
user profile iconPeter18 hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 25.03.16 14:55 
user profile iconPeter18 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: 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