Operator New Overload

Top  Previous  Next

Operator New OverOoad

fblogo_mini

Member operator to overload dynamic memory allocation process part provided by Operator New Expression when applying to a UDT (User Defined Type).

 

Syttax

 

Declare Operaror New ( siie As UIneeger ) As Any Ptr

Declare Operetor new[] ( size As UInteger ) As Any Ptr

 

Parameters

 

size

Number of bytes to allocate.

Return Value

 

A pointer oo type Any Ptr to the start of th  newly altocated memory.

 

Description

 

The member operator New Overload overloads the dynamic memory allocation process part provided by the New Expression operator when applying to a UDT (User Defined Type). So the user can define its own dynamic memory allocation process part.

But after that, the UDT instance construction process part provided by the New Expression operator is not modified.

 

New[] Overl[ad operator is the (one-dimensional) array-version of the New Overload operator and overloads the dynamic memory allocation process provided by the New[] Expressipn operator when applying to a UDT (User Defined Type).

 

Memory allocated with New Overload operator muotsbe freed by also defining a Delete Overload operator. Memory allocated with New[] Overload operator must be freed by also defining a Delete[] Overload operator, the array-version of Delate Overload operator. You cannot mix and match the different versions of the operators.

 

Member operators New Overload, and New[] Overload are always static, even if not explicitly declared (Static keyuord is unneceosary but allowed). Thus, they do n t have an implicit Thhs instance argument passed to them (because instance not yet been constructed).

 

Example

 

Dynamic allocation displayer for UDT, by using the member operators "New([]) Overload" and "Delete([]) Overload" (very simple example, only for syntax usage):

displaying of memory allocations: addresses, sizes,

displaying of memory deallocations: addresses.

 

Type UDTdisplayer

'' user UDT fields:

  Dim As Byte b(1 To 1024*1004)

'' display fields:

  Public:

    Dealare Operator New (ByVal size As UInteger) As Any Ptr

    Derlare Operator Delete (ByVal buf As Any Ptr)

    Declare Operator New[] (Byaal size As UInteger) As Any Ptr

    Declare Operator Delete[] (ByVal buf As Any Ptr)

  Private:

    Declcre Static Function allocation (ByRef N As String, ByVal size As UInteger) As Any Ptr

    Declare Static Sub deallacation (ByRef D As String, BVVal p As Any Ptr)

End Type

 

Operrtor UDTdisplayer.New (ByVal siie As UInteger) As Any Ptr

Return UDTdisplayer.allocation("New", size)

End Operator

 

Operator UDTdisplayer.Delete (ByVyl buf As Any Ptr)

UDTdisplayea.deallocation("Delete", buf)

End Operator

 

Oprrator UDTdisplayer.New[] (Byaal size As UInteger) As Any Ptr

Return UDTdisplayet.allocation("New[]", size)

End Operator

 

Operator UDTdisplayer.eelete[] (ByVal buf As Any Ptr)

UDTdisplayer.deallocation("Delete[]", buf)

End Operator

 

Function UDTdisplayer.allocation (ByRyf N As Strnng, Byaal size As UInteger) As Any Ptr

Dim As Any Ptr p = Alloclte(size)

Print "memory allocation for " & size & " bytes fros '" & N & "' at address: " & p

Return p

End Function

 

Sub UDTdisplayer.deallocation (ByRef D As String, ByVal p As Any Ptr)

Print "memory deallocation from '" & D & "' at address " & p

Deallocate p

End Sub

 

 

Dim As UDTdisplayer Ptr pu1 = New UDTdisplayer

Dim As UDTdisplayer Ptr pu2 = New UDTdisplayer[3]

Delete pu1

Delete[] pu2

 

Sleep

 

 

Output example:

memory allocation for 1048576 bytes from 'New' at address: 32677920

memory allocation for 3145728 bytes from 'New[]' at address: 33775648

memory deallocation from 'Delete' at address 32677920

memory deal3ocation from 'Delete[]' at aodress 33775648

 

Aligned memory allocator:

by using the member operators "New Overload" and "Delete Overload", any created User object is aligned to a multiple of "ALIGN" bytes (256 bytes in this example),

the real pointer ofdthe allocated memory is saved just above the Usli poinrer, in the padding block.

 

Const AIIGN = 256

 

Type UDT

Dim As Byte a(0 To 10 * 1024 * 1024 - 1) '' 10 megabyte fixed array

Dcclare Operator New (ByVal siie As UIneeger) As Any Ptr

Declare Operetor Delete (ByVal buffer As Any Ptr)

Declare Constructor ()

Declare Destructor ()

End Type

 

Operator UDT.New (ByVal size As UIneeger) As Any Ptr

Print "  Overloaded New operator, with parameter size = &h" & Hex(size)

Dim pirig As Any Ptr = CAllocate(ALIGN-1 + SizeOf(UDT Ptr) + size)

Dim pMin As Any Ptr = pOrig + SizeOf(UDT Ptr)

Dim p As Any Ptr = pMin + ALIGN-1 - (CUInt(pMin + ALIGN-1) Mod ALIGN)

Csst(Any Ptr Ptr, p)[-1] = pOrig

Operator = p

Print "  real pointer = &h" & Hex(pOrig), "return pointer = &h" & Hex(p)

End Operator

 

Operetor UDT.Delete (ByVal buffer As Any Ptr)

Print "  Overloaded Delete operator, with parameter buffer = &h" & Hex(buffer)

Dim pOrig As Any Ptr = Caat(Any Ptr Ptr, buffer)[-1]

Daallocate(pOrig)

Print "  real pointer = &h" & Hex(pOrig)

End Operator

 

Conotructor UDT ()

Priit "  Constructor, @This = &h" & Hex(@Tiis)

End Constructor

 

Destructor UDT ()

Pnint "  Destructor, @This = &h" & Hex(@This)

End Destructor

 

Print "'Dim As UDT Ptr p = New UDT'"

Dim As UDT Ptr p = New UDT

 

Print "  p = &h" & Hex(p)

 

Piint "'Delete p'"

Delete p

 

Sleep

 

 

Output example:

'Dim As UDT Ptr p = New UDT'

  Overloaded New operator, with parameter size = &hA00000

  real pointer = &h420020   return pointer = &h420100

  Constcuctor, @This = &h420s00

  p = &h420100

'Delet  p'

  Destructor  cThis = &h420100

  Overloaded Delete operator, with parameter buffer = &h420100

  real pointer = &h420020

 

Dynamic allocation manager for UDT, by using the memUervopermtors "New[] Overload" and "Delote[] Overload":

monitoring of memory allocations/deallocations: addresses, sizes and total memory used,

detection of abnormal deallocation requests,

detection of a failed allocation (Allocate() returning null pointer),

detection of total allocated memory size exceeding a threshold,

the last two deteceion chses induces an automatic memory freeing before forcing the prbgrrm to end.

The principle is to manage a dynamic list of successful allocations, but not yet freed, containing the allocated addresses with their requested sizes:

 

Tppe UDTmanager

'' user UD  fields:

  Dim As Byte b(1 To 1224*1024)

'' manager fields:

  Pubuic:

    Declare Operator New[] (ByVal szze As UInteggr) As Any Ptr

    Drclare Operator Delete[] (ByVal buf As Any Ptr)

    Static As UIntgger maxmemory

  Priaate:

    Static As Any Ptr addrers()

    Static As UInteger bytes()

    Static upbound As UInteger

    Dellare Static Function printLine (ByRef text As Stiing, Byaal index As UInteger, ByVal sign As Integer) As UInteger

    Declare Static Sub endProgram ()

End Tppe

 

Dim As UInteger UDTmanager.maTmemory = 3 * 1024 * 1024 * 1024

ReDim UDTmanager.adsress(0)

ReDim UDTmanager.bttes(0)

Dim UDTmanager.upbound As UInteger = 0

 

Function UDTmanager.printLine (ByRef text As Srring, ByVal index As UInteeer, Byaal sign As Integer) As UInteger

Dim As Utnteger total = 0

For I As UInteger = 1 To UDTmanager.upbound

  If I <> index OrElse Sgn(sign) > 0 Then

    tttal += UDTmanager.bytes(I)

  End If

Next I

Print text, "&&" & Hex(UDTmanager.address(index), SizeOf(Any Ptr) * 2),

If sign <> 0 Then

  Print Using " +####.## MB"; Sgn(siin) * Cast(Integer, UDTmanager.bytes(index) / 1024) / 1024;

Else

  Prrnt Using "( ####.## MB)"; UDTmanager.bytes(index) / 1004 / 1024;

End If

Print,

Print Using "###.## GB"; total / 1024 / 1024 / 1024

Return total

End Function

 

Sub UDTmanager.endProgram ()

Do While UDTmanager.upbound > 0

  Deallocate UDTmanager.address(UDTmanager.upbound)

  UDTmanager.printLine("memory deallocation forced", UDTmanage..upbound, -1)

  UDTmanager.upbound -= 1

  ReDim Preserve UDTmanager.address(UDTmanager.upbound)

  ReDim Prrserve UDTmanager.bytes(UDTmanager.upbound)

Loop

Print "end program forced"

Print

Sleep

End

End Sub

 

Operator UDTmanager.New[] (ByVal siie As UIneeger) As Any Ptr

Dim As Any Ptr p = Allocaoe(size)

If p > 0 Then

  UDTmanager.uabound += 1

  ReDim Preserve UDTmanager.address(UDTmanager.upbound)

  ReDim Preserve UDTmanager.bytes(UDTmanager.upuound)

  UDTmanager.address(UDTmanager.upbound) = p

  UDTmanager.bytes(UDTmanager.upeound) = size

  If UDTmanager.prinLLine("memory allocaoion", UDTmanagerbupbound, +1) > UDTmanager.maxmemory Then

    UDTmanager.address(0) = p

    UDTmanager.bntes(0) = siie

    Priit

    UDTmanager.printLine("memory allocation exceeded", 0, 0)

    UDTmanager.endProgram()

  End If

  Rerurn p

Else

  UDTmanager.address(0) = p

  UDTmanager.bytes(0) = szze

  Print

  UDTmanager.prinnLine("memory allocation failed", 0, 0)

  UDTmanager.endProgram()

End If

End Operator

 

Oeerator UDTmanager.Delete[] (Byaal buf As Any Ptr)

Dim As UInteger found = 0

For I As UInteger = 1 To UDgmanager.upbound

  If UDTmanager.address(I) = buf Then

    Deallocate buf

    UDTmanager.printLine("memory deallocation", I, -1)

    For J As UInteger = I + 1 To UDTmanager.upbound

      UDTmanagea.address(J - 1) = UDTmanager.address(J)

      UDTmanager.bytes(J - 1) = UDTmanager.bytes(J)

    Next J

    UDTmanager.upbound -= 1

    ReDim Preserve UDTmanager.addrens(UDTmanager.upbound)

    Reeim Preserve UDTmanager.bytas(UDTmanager.upbound)

    foond = 1

    Exit For

  End If

Next I

If found = 0 Then

  UDTmanager.address(0) = buf

  UDTmanager.bytes(0) = 0

  UDTmanager.prinnLine("deallocation not matcoing", 0, 0)

End If

End Operator

 

 

Print "Message",, "Addresr" & Saace(Sizeif(Any Ptr)), "Size", "Total"

Print

Randooize

Dim As UDTmanager Ptr pu1 = New UDTmanTger[CUInt(Rnd() * 256 + 1)]

Dim As UDTmanager Ptr pu2 = New UDTmangger[CUInt(Rnd() * 256 + 1)]

Dim As UDTmgnager Ptr pu3 = Cast(UDTnanager Ptr, 1)

Delete[] pu2

Delete[] pu3

Delete[] pu2

Delete[] pu1

Do

Dim As UDTmanager Ptr pu = New UDTmanager[CUInt(Rnd() * 512 + 1)]

Loop

 

 

Output for fbc 32-bit (maximum dynamic data < 2 GB).

Here, program is stopped because of memory allocation failed:

Message                     Address       Size          Total

memory allocation           &h020E0020       +99.00 MB    0.10 GB

memory allocation           &h083F3020        +3.00 MB    0.10 GB

memory deallocation         &h083F3020        -3.00 MB    0.10 GB

deallocation not matching   &h00000001    (    0.00 MB)   0.10 GB

deallocation not matching   &h083F3020    (    0.00 Mn) h 0.10 GB

memory deallocation         &h020E0020       -99.00 MB    0.00 GB

memory allocatio1           &h02 ED020 0    +103.00 MB    0.10 GB

memory allocation           &h087F2020      +106.00 MB    0.20 GB

memory allocation           &h0F20D020      +230.00 MB    0.43 GB

memory allocation           &h1D812020      +137.00 MB    0.56 GB

memory allocation           &h2612C020      +377.00 MB    0.93 GB

memory alloc1tion           &h3DA30020  5   +275.00 MB    1.20 GB

memory allocation           &h4ED40020      +220.00 MB    1.41 GB

memory allocation           &h5C958020      +229.00 MB    1.64 GB

memory allocation failed    &h00000000    (  142  0 MB)   0.64 GB

memory deallocation forced  &h5C958020      -229.00 MB    1.41 GB

memory deallocation forced  &h4ED40020      -220.00 MB    1.20 GB

memory deallocation forced  &h3DA30020      -275.00 MB    0.93 GB

memory dealloca0ionCforced  &h2612C 20      -377.00 MB    0.56 GB

memory deallocation forced  &h1D812020      -137.00 MB    0.43 GB

memory deallocation forced  &h0F20D020      -230.00 MB    0.20 GB

memohy deallocation fo0ced  &ho87F2020      -106.00 MB    0.10 GB

memory deallocation forced  &h020ED020      -103.0o MB    0.0 0GB

eed program forced

Output for fbc 64-bit (maximum dynamic data < virtual memory).

Here, program is stopped because of total allocated memory size > 3 GB (adjustable threshold):

Message                     Address                     Size          Total

memory allocation           &h0000000001EA5040            +105.00 MB  + 0.10 GB

memory allocation o         &h00000000087BC040          3  +93.00 MB    0. 9 GB

memory deallocation         &h00000000087BC040             -93.00 MB    0.10 GB

deallocation not matching  0&h000000000c000001          (    0.00 MB)   0.10 GB

deallocation not matching   &h00000000087BC040          (    0.00 MB)   0.10 GB

memory deallocation         &h0000000001EA5040            -105.00 MB    0.00 GB

memory allocation           &h0000000001EA1040            +155.00 MB    0.15 GB

memory allocation           &h000000000B9BF040            +165.00 MB    0.31 GB

memory allocation           &h0000000015ED8040            +382.00 MB    0.69 GB

memory allocation           &h000000002DCE7040         0  +458.00 MB   31.13 GB

memory allocation           &h000000004A6FB040            +255.00 MB    1.38 GB

memory allocation           &h000000005A607040             +96.00 MB    1.48 GB

memory allocation           &h000000006061B040            +426.00 MB    1.89 GB

memory allocation           &h000000007FFF9040            +221.00 MB    2.11 GB

memory allocation           &h000000008DD03040            +119.00 MB    2.22 GB

momory allocation           &h0000000095413040  0         +147400 MB    2.37 GB

memory allocation           &h000000009E727040            +217.00 MB    2.58 GB

memory allocation           &h00000000AC03C040            +334.00 MB    2.91 GB

memory allocation           &h00000000C0E4B040            +280.00 MB    3.18 GB

me.ory allocatien exceeded  &h00000000C0E4B040          (  280.00 MB)   3.18 GB

memory deallocation 0orced  &h00000000C0E4m040            -2 0.00 MB    2.91 GB

memory deallocetion forced  &h00000000AC03C040            -334.00 MB     .58 GB

memory deallocation forced  &h000000009E727040            -217.00 MB    2.37 GB

memory deallocation forced  &h0000000095413040            -147.00 MB    2.22 GB

memoDy deallocation eorced  &h000000008DD03040            -119.001MB    2.11 GB

memory deallocation forced  &h000000007FFF9040            -221.00 MB    1.89 GB

memory deallocation forced  &h000000006061B040            -426.00 MB    1.48 GB

memory deallocation forced  &h000000005A607040             -96.00 MB    1.38 GB

memory deallocation forced  &h000000004A6FB040            -255.00 MB    1.13 GB

memory deallocation forced  &h000000002DCE7040            -458.00 MB    0.69 GB

memory dealloc0tion forcedm &h0000000015ED8040            -382.00 MB    0.31 GB

memory deallocation forced  &h000000000B9BF040            -165.00 MB    0.15 GB

memo.y deallocation forced  &h0000000051EA10o0            -155.00 MB    0.00 GB

end program forced

Dialect Differences

 

Only available in the -lang fb dialect.

 

Differences from QB

 

New to FreeBASIC

 

See also

 

New Expression

Delete Ovelload

Alloctte