[Overview][Constants][Types][Classes][Procedures and functions][Variables][Index] | Reference for unit 'System' (#rtl)

# Initialize

Initialize memory block using RTTI

## Declaration

Source position: system.fpd line 96

`procedure Initialize(`
`var T: TAnyType;`
`ACount: SizeInt = 1`
`);`

## Description

Initialize is a compiler intrinsic: it initializes a memory area T for any kind of managed variable. Initializing means zeroing out the memory area. In this sense it is close in functionality to Default, but Default requires an already initialized variable. It performs the opposite operation of finalize, which should be used to clean up the memory block when it is no longer needed.

The optional ACount parameter can be used to initialize an array. It then specifies the number of elements in the array.

## See also

finalize |  | Finalize (clean up) memory block using RTTI
Default |  | Return Default initialized value
TypeInfo |  | Return pointer to type information for type

## Example

    {
      This example demonstrates the use of the Initialize and Finalize functions
      used to initialize (and clean up) any RTTI-enabled data not allocated with
      New or Create.
    }

    {$mode objfpc}
    {$h+} // use ansistrings, they need to be initialized.
    Type
      PData = ^TData;
      TData = record
        Street,City,Zip,Country, Tel: String;
        StreetNumber : Integer;
      end;

    var
      Data: PData;

    begin
      // Do not use New.
      GetMem(Data,SizeOf(TData));
      Try
        { Initialize the structure in memory, using Run-Time Type Information}
        Initialize(Data^);
        { Assign some string data to the ansistring contents.
          Note that this only works because the record was zeroed out by Initialize}
        Data^.Street:='Sesame Street';
        Data^.City:='Heaven';
        Data^.Zip:='7777777';
        Data^.Country:='Spain';
        Data^.StreetNumber:=3;
      Finally
        { Clean up the record contents.
          Again, the structure of the record is detected through
          Run-time Type Information }
        Finalize(Data^);
        FreeMem(Data);
      end;
    end.

## Example

    {
      This example demonstrates the use of the Initialize and Finalize functions
      used to initialize (and clean up) any RTTI-enabled data not allocated with
      New or Create.
    }

    {$mode objfpc}
    {$h+} // use ansistrings, they need to be initialized.
    Type
      PData = ^TData;
      TData = record
        Street,City,Zip,Country, Tel: String;
        StreetNumber : Integer;
      end;

    var
      Data: PData;

    begin
      // We use the fact that a pointer is also usable as an array.
      GetMem(Data,SizeOf(TData)*2);
      Try
        { Initialize the structure in memory, using Run-Time Type Information}
        Initialize(Data^,2);
        { Assign some string data to the ansistring contents.
          Note that this only works because the record was zeroed out by Initialize}
        Data[0].Street:='Sesame Street';
        Data[0].City:='Heaven';
        Data[0].Zip:='7777777';
        Data[0].Country:='Spain';
        Data[0].StreetNumber:=3;
        // Second, well known street
        Data[1].Street:='Wall Street';
        Data[1].City:='New York';
        Data[1].Zip:='10005';
        Data[1].Country:='USA';
        Data[1].StreetNumber:=11;
      Finally
        { Clean up the record contents.
          Again, the structure of the record is detected through
          Run-time Type Information }
        Finalize(Data^);
        FreeMem(Data);
      end;
    end.