Zitat von
xaromz:
Hallo,
das ist eine ganz normale Lösung, die wunderbar funktioniert. Gefährlich ist die nicht, der Aufrufer darf nur nicht vergessen, den Speicher wieder freizugeben. Deshalb sollte für einen solchen Zweck eine Prozedur genommen werden, der man den Speicherbereich übergibt; dann muss der Aufrufer sowohl den Speicher anfordern als auch wieder freigeben. Deine erste Variante hingegen ist sehr gefährlich, da sie einen Pointer auf eine lokale Variable zurückgibt, der nach dem Aufruf nicht mehr gültig ist.
Gruß
xaromz
Das mit dem Speicher freigeben, mag zwar stimmen, jedoch ist Vergessen immer möglich. Und eigentlich hat es hiermit garnichts zu tun.
Dass der Aufrufer den Speicher reservieren muss ist jedoch viel gefährlicher, weil man nie sagen kann, ob der Speicher überhaupt genug ist. Nebenbei ist dem Aufrufer garnicht bekannt wie groß der Array sein wird. Er ist dynamisch. Aber das ist unter den Tisch gefallen, der Einfachheit wegen.
Dass der Benutzer ihn freigibt ist auch kein Problem. Man schreibt es direkt in den Funktionskommentar. Dazu könnte man noch eine Funktion schreiben, die ihn freigibt. Schon die Anwesenheit davon, fordert zum Aufruf auf. Man könnte die Objekte auch intern noch verwalten und am Ende freigen (ala
VCL und Owner) - aber das kann auch ihn die Hose gehen.
Zitat von
Muetze1:
Mein Vorschlag:
Delphi-Quellcode:
function GetAccessNames(out iCount : Cardinal): PSI_ACCESS;
var lSiEntry: PSI_ACCESS;
i : Cardinal;
begin
iCount := 32;
GetMem(lSiEntry, Sizeof(si) * iCount);
result := lSiEntry;
for i := 0 to iCount -1 do
begin
hier zugriff auf lSiEntry^ ganz leicht
Inc(lSiEntry);
end;
end;
Der Vorschlag ist nur zum Elementzugriff. Die angesprochene Alloziierung von Speicher welche auf einer anderen Ebene freigegeben wird, ist hier nicht korrigiert und sollte wie von xaromz beschrieben gelöst werden.
Das ist zwar auch eine Möglichkeit, jedoch ist diese meiner Meinung nach schlecht, da es von C her stammt und Delphi nicht würdig ist. Man kann auch nicht auf beliebige Arrayelemente durcheinander zugreifen.