Ver Mensaje Individual
  #2  
Antiguo 06-05-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola doctorhd.
Cita:
Empezado por doctorhd Ver Mensaje
...
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 [-]
// AllocMem
var
  buffer: PChar;
  s     : string;
begin
  s := 'usando AllocMem'+#0;
  try
    // AllocMem inicializa la memoria asignada con ceros 0
    buffer  := AllocMem(Length(s));
    ShowMessage(buffer);  // cadena vacia
    StrPCopy(buffer, s);
    ShowMessage(buffer);
  finally
    FreeMem(buffer);
  end;
end;

// GetMem
var
  buffer: PChar;
  s     : string;
begin
  s := 'usando GetMem'+#0;
  try
    // GetMem no inicializa la memoria asignada
    GetMem(buffer, Length(s));
    ShowMessage(buffer);  // basura
    StrPCopy(buffer, s);
    ShowMessage(buffer);
  finally
    FreeMem(buffer);
  end;
end;


// New
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 no inicializa la memoria asignada
    New(pr);
    ShowMessage(Format('%s %d',[pr.dato1, pr.dato2])); // basura
    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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita