Hallo.
Wenn ein Array immer eine separate Freigabe benötigt, dann brauche ich ja den Ressourcenschutzblock in meiner Prozedur, die den Array mit Elementen befüllt, nicht mehr.
Ich habe jetzt das Freigeben der Arrayelemente ("Freigeben des Arrays") noch ausgelagert:
Delphi-Quellcode:
procedure FreeSubmissionArray(SubmissionArray: TSubmissionArray);
var
i: integer;
begin
for i := 0 to High(SubmissionArray) do
begin
SubmissionArray[i].Free;
end;
end;
Diese Prozedur führe ich nun aus, wenn ich den Array nicht mehr brauche. Zu Memory-Leaks kommt es nicht.
Ist das jetzt eine Variante, wie sie auch professionell gemacht werden würde, oder ist das, was ich hier mache, in irgend einer Weise ungünstig? Es ist eben irgendwie für mich von Nachteil, da ich nun bei den TSubmissionArrays niemals FreeSubmissionArray() vergessen darf.
Ich hatte auch noch mal probiert, die Funktion AddToArray so zu modifizieren, dass das Objekt vor dem Hinzufügen zum Array kopiert wird. Ist leider fehlgeschlagen:
Delphi-Quellcode:
procedure AddToArray(var SubmissionArray: TSubmissionArray; const Value: TSubmission);
var
l: integer;
begin
l := Length(SubmissionArray);
SetLength(SubmissionArray, l + 1);
SubmissionArray[l] := TSubmission(Value.NewInstance); // Kopieren? Eher nicht...
end;
Entschuldige bitte mein Unwissen, aber was ist eine "Objektliste"? Diesen Ausdruck habe ich noch nicht gehört. Auch Google sagt mir jetzt nicht wirklich eine Definition von dem Begriff.
Darf ich eine kleine Frage am Rande stellen?
Eine überladene Funktion von AddToArray arbeitet mit Strings:
Delphi-Quellcode:
type
TStringArray: array of String;
procedure AddToArray(var StringArray: TStringArray; const Value: string);
var
l: integer;
begin
l := Length(StringArray);
SetLength(StringArray, l + 1);
StringArray[l] := Value;
end;
Muss ich hier mit UniqueString() arbeiten, oder wird hier der String tatsächlich in den Array kopiert? Wenn nicht, dann würde sich doch der Array ändern, wenn ich den String, den ich AddToArray() gegeben habe, ändere, oder?
Gruß
blackdrake