Hola doctorhd.
Cita:
Empezado por doctorhd
...
Mi pregunta es AllocMem y GetMen hacen asignación de memoria disponible o asignan memoria de la que primero encuentran, ya que de acuerdo a las pruebas realizadas, ambos métodos interfieren con la memoria utilizada por otras variables o componentes asignados con anterioridad....Y por ultimo que diferencia existe entre estos dos métodos y el comando NEW...
Saludos....
|
AllocMem y
GetMem hacen uso, de ser posible, de la
memoria disponible en el heap. No utilizan la primera memoria que encuentran, de otro modo su uso sería un tormento y el autor un perverso.
La diferencia entre la función
AllocMem y el procedimiento
GetMem es que el primero inicializa la memoria asignada y el segundo no. Debido a esto último
GetMem es mas eficiente en velocidad (pero a veces es necesaria la inicializacion).
New difiere de los anteriores en que no es necesario indicarle el tamaño a de memoria a asignar, pero no puede manejar un tamaño arbitrario de memoria.
Unos ejemplos muy sencillos de cada uno:
Código Delphi
[-]
var
buffer: PChar;
s : string;
begin
s := 'usando AllocMem'+#0;
try
buffer := AllocMem(Length(s));
ShowMessage(buffer); StrPCopy(buffer, s);
ShowMessage(buffer);
finally
FreeMem(buffer);
end;
end;
var
buffer: PChar;
s : string;
begin
s := 'usando GetMem'+#0;
try
GetMem(buffer, Length(s));
ShowMessage(buffer); StrPCopy(buffer, s);
ShowMessage(buffer);
finally
FreeMem(buffer);
end;
end;
procedure TForm1.btnNewClick(Sender: TObject);
type
PReg = ^TReg;
TReg = record
dato1: PChar;
dato2: Integer;
end;
var
pr: PReg;
s : string;
begin
s := 'usando New'+#0;
pr := nil;
try
New(pr);
ShowMessage(Format('%s %d',[pr.dato1, pr.dato2])); GetMem(pr.dato1, Length(s));
StrPCopy(pr.dato1,s);
pr.dato2 := 1397;
ShowMessage(Format('%s %d',[pr.dato1, pr.dato2]));
finally
FreeMem(pr.dato1);
Dispose(pr);
end;
end;
Saludos
