Unit 'System' Package
[Overview][Constants][Types][Classes][Procedures and functions][Variables][Index] [#rtl]

Initialize

Initialize memory block using RTTI.

Declaration

Source position: system.fpd line 100

procedure Initialize(

  var T: TManagedType;

  ACount: SizeInt = 1

);

Description

Initialize is a compiler intrinsic: it initializes a memory area belonging to a variable T of a managed type (TManagedType). Initializing means zeroing out the memory area. In this sense it is close in functionality to Default, but Default returns an already initialized variable, whereas Initialize initializes managed types in a previously declared memory area.

Default is a function, and one can think of Initialize as the procedural version of Default.

Initialize 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.

Note that the function can be used on an already used variable, and that for structured types, only managed fields are initialized.

See also

Finalize

  

Finalize (clean up) memory block using RTTI.

Default

  

Return Default initialized value.

ManagedTypes

  

A list of managed types.

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.  

Example

program ex123;

{
  Example to show that Initialize can be used on a variable that was already used, 
  and that only fields of managed type are affected.
}

type
  TTest = object
    I: Integer;
    S: AnsiString;
  end;

procedure Test;

var
  V: TTest;

begin
  V.I := 10;
  V.S := 'x';
  WriteLn(V.I);
  WriteLn(V.S);
  Initialize(V);
  WriteLn(V.I); // unchanged
  WriteLn(V.S); // empty
end;

begin
  Test;
end.        

Documentation generated on: Jul 24 2023