Skip to content

Commit 5d1ac76

Browse files
committed
fbdoc: wiki snapshot 2018-09-03
1 parent a8d5d02 commit 5d1ac76

File tree

8 files changed

+643
-292
lines changed

8 files changed

+643
-292
lines changed

doc/manual/cache/CatPgFullIndex.wakka

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,7 @@ Alphabetical listing of keywords, macros and procedures.
273273
- {{fbdoc item="keyword" value="KeyPgFreefile|FREEFILE"}}
274274
- {{fbdoc item="keyword" value="KeyPgFunction|FUNCTION"}}
275275
- {{fbdoc item="keyword" value="KeyPgMemberFunction|FUNCTION (Member)"}}
276+
- {{fbdoc item="keyword" value="KeyPgFunctionPtr|FUNCTION (Pointer)"}}
276277

277278
{{fbdoc item="section" value="G"}}{{anchor name="g"}}
278279
- {{fbdoc item="keyword" value="KeyPgGetgraphics|GET (Graphics)"}}
@@ -516,6 +517,7 @@ Alphabetical listing of keywords, macros and procedures.
516517
- {{fbdoc item="keyword" value="KeyPgOpStrptr|STRPTR"}}
517518
- {{fbdoc item="keyword" value="KeyPgSub|SUB"}}
518519
- {{fbdoc item="keyword" value="KeyPgMemberSub|SUB (Member)"}}
520+
- {{fbdoc item="keyword" value="KeyPgSubPtr|SUB (Pointer)"}}
519521
- {{fbdoc item="keyword" value="KeyPgSwap|SWAP"}}
520522
- {{fbdoc item="keyword" value="KeyPgSystem|SYSTEM"}}
521523

doc/manual/cache/CatPgFunctIndex.wakka

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ List of ""FreeBASIC"" keywords sorted by the function they perform.
7474
- {{fbdoc item="keyword" value="KeyPgDouble|DOUBLE"}}
7575
- {{fbdoc item="keyword" value="KeyPgEnum|ENUM"}}
7676
- {{fbdoc item="keyword" value="KeyPgExtends|EXTENDS"}}
77+
- {{fbdoc item="keyword" value="KeyPgFunctionPtr|FUNCTION (Pointer)"}}
7778
- {{fbdoc item="keyword" value="KeyPgImplements|IMPLEMENTS"}}
7879
- {{fbdoc item="keyword" value="KeyPgInteger|INTEGER"}}
7980
- {{fbdoc item="keyword" value="KeyPgLong|LONG"}}
@@ -85,6 +86,7 @@ List of ""FreeBASIC"" keywords sorted by the function they perform.
8586
- {{fbdoc item="keyword" value="KeyPgSingle|SINGLE"}}
8687
- {{fbdoc item="keyword" value="KeyPgStatic|STATIC"}}
8788
- {{fbdoc item="keyword" value="KeyPgString|STRING"}}
89+
- {{fbdoc item="keyword" value="KeyPgSubPtr|SUB (Pointer)"}}
8890
- {{fbdoc item="keyword" value="KeyPgType|TYPE"}}
8991
- {{fbdoc item="keyword" value="KeyPgTypeAlias|TYPE (Alias)"}}
9092
- {{fbdoc item="keyword" value="KeyPgTypeTemp|TYPE (Temporary)"}}

doc/manual/cache/CompilerErrMsg.wakka

Lines changed: 290 additions & 285 deletions
Large diffs are not rendered by default.

doc/manual/cache/KeyPgFunctionPtr.wakka

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ Data type that stores a pointer to a ##[[KeyPgFunction|FUNCTION]]## procedure re
1616
{{fbdoc item="desc"}}
1717
A ##[[KeyPgFunction|Function]]## pointer is a procedure pointer that stores the memory location of compiled code that returns a value. If no intializer is given the default initial value is zero (0).
1818

19-
The memory address for the ##[[KeyPgFunction|Function]]## procedure can be assigned to the variable by taking the address of a subroutine with ##[[KeyPgOpProcPtr|ProcPtr]]## or ##[[KeyPgOpAt|Operator @ (Address of)]]##.
19+
The memory address for the ##[[KeyPgFunction|Function]]## procedure can be assigned to the variable by taking the address of a subroutine with ##[[KeyPgOpProcptr|ProcPtr]]## or ##[[KeyPgOpAt|Operator @ (Address of)]]##.
2020

2121
The procedure must match the same ##[[KeyPgFunction|Function]]## declaration as the declared ##[[KeyPgFunction|Function]]## pointer.
2222

@@ -97,7 +97,7 @@ Print operation(4, @x3)
9797

9898
{{fbdoc item="see"}}
9999
- ##[[KeyPgSub|Sub]]##
100-
- ##[[KeyPgOpProcPtr|ProcPtr]]##
100+
- ##[[KeyPgOpProcptr|ProcPtr]]##
101101
- ##[[KeyPgOpAt|Operator @ (Address of)]]##
102102

103103
{{fbdoc item="back" value="CatPgStdDataTypes|Standard Data Types"}}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
{{fbdoc item="title" value="Operator Delete Overload"}}----
2+
Member operator to overload memory deallocation process part provided by ##[[KeyPgOpDelete|Operator Delete Statement]]## when applying to a UDT (User Defined Type).
3+
4+
{{fbdoc item="syntax"}}##
5+
[[KeyPgDeclare|declare]] [[KeyPgOperator|operator]] **delete** ( //buf// [[KeyPgAs|as]] [[KeyPgAny|any]] [[KeyPgPtr|ptr]] )
6+
[[KeyPgDeclare|declare]] [[KeyPgOperator|operator]] **delete[]** ( //buf// [[KeyPgAs|as]] [[KeyPgAny|any]] [[KeyPgPtr|ptr]] )
7+
##
8+
{{fbdoc item="param"}}
9+
##//buf//##
10+
A pointer to memory that has been allocated by ##[[KeyPgOpNewOverload|New Overload]]## operator or ##**New[] Overload**## operator, the array-version of ##[[KeyPgOpNewOverload|New Overload]]## operator.
11+
12+
{{fbdoc item="desc"}}
13+
The member operator ##**Delete Overload**## overloads the memory deallocation process part provided by the ##[[KeyPgOpDelete|Delete Statement]]## operator when applying to a UDT (User Defined Type). So the user can define its own memory deallocation process part.
14+
But before that, the UDT instance destruction process part provided by the ##[[KeyPgOpDelete|Delete Statement]]## operator is not modified.
15+
16+
##**Delete[] Overload**## operator is the array-version of ##**Delete Overload**## operator and overloads the memory deallocation process provided by the ##**Delete[] Statement**## operator when applying to a UDT (User Defined Type).
17+
18+
Memory freed with ##**Delete Overload**## operator must have be allocated with ##[[KeyPgOpNewOverload|New Overload]]## operator. Memory freed with ##**Delete[] Overload**## operator must have been allocated with ##**New[] Overload operator**##, the array-version of ##[[KeyPgOpNewOverload|New Overload]]## operator. You cannot mix and match the different versions of the operators.
19+
20+
Member operators ##**Delete Overload**##, and ##**Delete[] Overload**## are always static, even if not explicitly declared (##[[KeyPgStaticMember|static]]## keyword is unnecessary but allowed). Thus, they do not have an implicit ##[[KeyPgThis|This]]## instance argument passed to them (because instance already been destroyed).
21+
22+
{{fbdoc item="ex"}}
23+
See the ##[[KeyPgOpNewOverload|New Overload]]## operator examples.
24+
25+
{{fbdoc item="lang"}}
26+
- Only available in the //[[CompilerOptlang|-lang fb]]// dialect.
27+
28+
{{fbdoc item="diff"}}
29+
- New to ""FreeBASIC""
30+
31+
{{fbdoc item="see"}}
32+
- ##[[KeyPgOpDelete|Delete Statement]]##
33+
- ##[[KeyPgOpNewOverload|New Overload]]##
34+
- ##[[KeyPgDeallocate|Deallocate]]##
35+
36+
{{fbdoc item="back" value="CatPgOpMemory|Memory Operators"}}{{fbdoc item="back" value="CatPgOperators|Operators"}}
Lines changed: 302 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,302 @@
1+
{{fbdoc item="title" value="Operator New Overload"}}----
2+
Member operator to overload dynamic memory allocation process part provided by ##[[KeyPgOpNew|Operator New Expression]]## when applying to a UDT (User Defined Type).
3+
4+
{{fbdoc item="syntax"}}##
5+
[[KeyPgDeclare|declare]] [[KeyPgOperator|operator]] **new** ( //size// [[KeyPgAs|as]] [[KeyPgUinteger|uinteger]] ) [[KeyPgAs|as]] [[KeyPgAny|any]] [[KeyPgPtr|ptr]]
6+
[[KeyPgDeclare|declare]] [[KeyPgOperator|operator]] **new[]** ( //size// [[KeyPgAs|as]] [[KeyPgUinteger|uinteger]] ) [[KeyPgAs|as]] [[KeyPgAny|any]] [[KeyPgPtr|ptr]]
7+
##
8+
{{fbdoc item="param"}}
9+
##//size//##
10+
Number of bytes to allocate.
11+
12+
{{fbdoc item="ret"}}
13+
A pointer of type [[KeyPgAny|any]] [[KeyPgPtr|ptr]] to the start of the newly allocated memory.
14+
15+
{{fbdoc item="desc"}}
16+
The member operator ##**New Overload**## overloads the dynamic memory allocation process part provided by the ##[[KeyPgOpNew|New Expression]]## operator when applying to a UDT (User Defined Type). So the user can define its own dynamic memory allocation process part.
17+
But after that, the UDT instance construction process part provided by the ##[[KeyPgOpNew|New Expression]]## operator is not modified.
18+
19+
##**New[] Overload**## operator is the array-version of the ##**New Overload**## operator and overloads the dynamic memory allocation process provided by the ##**New[] Expression**## operator when applying to a UDT (User Defined Type).
20+
21+
Memory allocated with ##**New Overload**## operator must be freed with ##[[KeyPgOpDeleteOverload|Delete Overload]]## operator. Memory allocated with ##**New[] Overload**## operator must be freed with ##**Delete[] Overload**## operator, the array-version of ##[[KeyPgOpDeleteOverload|Delete Overload]]## operator. You cannot mix and match the different versions of the operators.
22+
23+
Member operators ##**New Overload**##, and ##**New[] Overload**## are always static, even if not explicitly declared (##[[KeyPgStaticMember|static]]## keyword is unnecessary but allowed). Thus, they do not have an implicit ##[[KeyPgThis|This]]## instance argument passed to them (because instance not yet been constructed).
24+
25+
{{fbdoc item="ex"}}
26+
27+
Aligned memory allocator:
28+
- 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),
29+
- the real pointer of the allocated memory is saved just above the User pointer, in the padding block.
30+
{{fbdoc item="filename" value="examples/manual/udt/newoverload1.bas"}}
31+
%%(freebasic)
32+
Const ALIGN = 256
33+
34+
Type UDT
35+
Dim As Byte a(0 to 10 * 1024 * 1024 - 1) '' 10 megabyte fixed array
36+
Declare Operator New (Byval size As UInteger) As Any Ptr
37+
Declare Operator Delete (Byval buffer As Any Ptr)
38+
Declare Constructor ()
39+
Declare Destructor ()
40+
End Type
41+
42+
Operator UDT.New (Byval size As UInteger) As Any Ptr
43+
Print " Overloaded New operator, with parameter size = &h" & Hex(size)
44+
Dim pOrig As Any Ptr = Callocate(ALIGN-1 + Sizeof(UDT Ptr) + size)
45+
Dim pMin As Any Ptr = pOrig + Sizeof(UDT Ptr)
46+
Dim p As Any Ptr = pMin + ALIGN-1 - (Culng(pMin + ALIGN-1) Mod ALIGN)
47+
Cast(Any Ptr Ptr, p)[-1] = pOrig
48+
Operator = p
49+
Print " real pointer = &h" & Hex(pOrig), "return pointer = &h" & Hex(p)
50+
End Operator
51+
52+
Operator UDT.Delete (Byval buffer As Any Ptr)
53+
Print " Overloaded Delete operator, with parameter buffer = &h" & Hex(buffer)
54+
Dim pOrig As Any Ptr = Cast(Any Ptr Ptr, buffer)[-1]
55+
Deallocate(pOrig)
56+
Print " real pointer = &h" & Hex(pOrig)
57+
End Operator
58+
59+
Constructor UDT ()
60+
Print " Constructor, @This = &h" & Hex(@This)
61+
End Constructor
62+
63+
Destructor UDT ()
64+
Print " Destructor, @This = &h" & Hex(@This)
65+
End destructor
66+
67+
Print "'Dim As UDT Ptr p = New UDT'"
68+
Dim As UDT Ptr p = New UDT
69+
70+
Print " p = &h" & Hex(p)
71+
72+
Print "'Delete p'"
73+
Delete p
74+
75+
Sleep
76+
%%
77+
78+
Output example:
79+
%%
80+
'Dim As UDT Ptr p = New UDT'
81+
Overloaded New operator, with parameter size = &hA00000
82+
real pointer = &h420020 return pointer = &h420100
83+
Constructor, @This = &h420100
84+
p = &h420100
85+
'Delete p'
86+
Destructor, @This = &h420100
87+
Overloaded Delete operator, with parameter buffer = &h420100
88+
real pointer = &h420020
89+
%%
90+
91+
Dynamic allocation manager for UDT, by using the member operators "New[] Overload" and "Delete[] Overload":
92+
- monitoring of memory allocations/deallocations: addresses, sizes and total memory used,
93+
- detection of abnormal deallocation requests,
94+
- detection of a failed allocation (Allocate() returning null pointer),
95+
- detection of total allocated memory size exceeding a threshold,
96+
- the last two detection cases induces an automatic memory freeing before forcing the program to end.
97+
The principle is to manage a dynamic list of successful allocations, but not yet freed, containing the allocated addresses with their requested sizes:
98+
{{fbdoc item="filename" value="examples/manual/udt/newoverload2.bas"}}
99+
%%(freebasic)
100+
Type UDTmanager
101+
'' user UDT fields:
102+
Dim As Byte b(1 to 1024*1024)
103+
'' manager fields:
104+
Public:
105+
Declare Operator New[] (Byval size As Uinteger) As Any Ptr
106+
Declare Operator Delete[] (Byval buf As Any Ptr)
107+
Static As Uinteger maxmemory
108+
Private:
109+
Static As Any Ptr address()
110+
Static As Uinteger bytes()
111+
Static upbound As Uinteger
112+
Declare Static Function printLine (Byref text As String, Byval index As Uinteger, Byval sign As Integer) As Uinteger
113+
Declare Static Sub endProgram ()
114+
End Type
115+
116+
Dim As Uinteger UDTmanager.maxmemory = 3 * 1024 * 1024 * 1024
117+
Redim UDTmanager.address(0)
118+
Redim UDTmanager.bytes(0)
119+
Dim UDTmanager.upbound As Uinteger = 0
120+
121+
Function UDTmanager.printLine (Byref text As String, Byval index As Uinteger, Byval sign As Integer) As Uinteger
122+
Dim As UInteger total = 0
123+
For I As Uinteger = 1 To UDTmanager.upbound
124+
If I <> index Orelse Sgn(sign) > 0 Then
125+
total += UDTmanager.bytes(I)
126+
End If
127+
Next I
128+
Print text, "&h";
129+
Print Hex(UDTmanager.address(index), Sizeof(Any Ptr) * 2),
130+
If sign <> 0 Then
131+
Print Using " +####.## MB"; Sgn(sign) * Cast(Integer, UDTmanager.bytes(index) / 1024) / 1024;
132+
Else
133+
Print Using "( ####.## MB)"; UDTmanager.bytes(index) / 1024 / 1024;
134+
End If
135+
Print,
136+
Print Using "###.## GB"; total / 1024 / 1024 / 1024
137+
Return total
138+
End Function
139+
140+
Sub UDTmanager.endProgram ()
141+
Do While UDTmanager.upbound > 0
142+
Deallocate UDTmanager.address(UDTmanager.upbound)
143+
UDTmanager.printLine("memory deallocation forced", UDTmanager.upbound, -1)
144+
UDTmanager.upbound -= 1
145+
Redim Preserve UDTmanager.address(UDTmanager.upbound)
146+
Redim Preserve UDTmanager.bytes(UDTmanager.upbound)
147+
Loop
148+
Print "end program forced"
149+
Print
150+
Sleep
151+
End
152+
End Sub
153+
154+
Operator UDTmanager.New[] (Byval size As Uinteger) As Any Ptr
155+
Dim As Any Ptr p = Allocate(size)
156+
If p > 0 Then
157+
UDTmanager.upbound += 1
158+
Redim Preserve UDTmanager.address(UDTmanager.upbound)
159+
Redim Preserve UDTmanager.bytes(UDTmanager.upbound)
160+
UDTmanager.address(UDTmanager.upbound) = p
161+
UDTmanager.bytes(UDTmanager.upbound) = size
162+
If UDTmanager.printLine("memory allocation", UDTmanager.upbound, +1) > UDTmanager.maxmemory Then
163+
UDTmanager.address(0) = p
164+
UDTmanager.bytes(0) = size
165+
Print
166+
UDTmanager.printLine("memory allocation exceeded", 0, 0)
167+
UDTmanager.endProgram()
168+
End If
169+
Return p
170+
Else
171+
UDTmanager.address(0) = p
172+
UDTmanager.bytes(0) = size
173+
Print
174+
UDTmanager.printLine("memory allocation failed", 0, 0)
175+
UDTmanager.endProgram()
176+
End If
177+
End Operator
178+
179+
Operator UDTmanager.Delete[] (Byval buf As Any Ptr)
180+
Dim As Uinteger found = 0
181+
For I As Uinteger = 1 To UDTmanager.upbound
182+
If UDTmanager.address(I) = buf Then
183+
Deallocate buf
184+
UDTmanager.printLine("memory deallocation", I, -1)
185+
For J As Uinteger = I + 1 To UDTmanager.upbound
186+
UDTmanager.address(J - 1) = UDTmanager.address(J)
187+
UDTmanager.bytes(J - 1) = UDTmanager.bytes(J)
188+
Next J
189+
UDTmanager.upbound -= 1
190+
Redim Preserve UDTmanager.address(UDTmanager.upbound)
191+
Redim Preserve UDTmanager.bytes(UDTmanager.upbound)
192+
found = 1
193+
Exit For
194+
End If
195+
Next I
196+
If found = 0 Then
197+
UDTmanager.address(0) = buf
198+
UDTmanager.bytes(0) = 0
199+
UDTmanager.printLine("deallocation not matching", 0, 0)
200+
End If
201+
End Operator
202+
203+
204+
Print "Message",, "Address"& Space(Sizeof(Any Ptr)), "Size", "Total"
205+
Print
206+
Randomize
207+
Dim As UDTmanager Ptr pu1 = New UDTmanager[Rnd() * 256 + 1]
208+
Dim As UDTmanager Ptr pu2 = New UDTmanager[Rnd() * 256 + 1]
209+
Dim As UDTmanager Ptr pu3 = Cast(UDTmanager Ptr, 1)
210+
Delete[] pu2
211+
Delete[] pu3
212+
Delete[] pu2
213+
Delete[] pu1
214+
Do
215+
Dim As UDTmanager Ptr pu = New UDTmanager[Rnd() * 512 + 1]
216+
Loop
217+
%%
218+
219+
Output for fbc 32-bit (maximum dynamic data < 2 GB).
220+
Here, program is stopped because of memory allocation failed:
221+
%%
222+
Message Address Size Total
223+
224+
memory allocation &h020E0020 +99.00 MB 0.10 GB
225+
memory allocation &h083F3020 +3.00 MB 0.10 GB
226+
memory deallocation &h083F3020 -3.00 MB 0.10 GB
227+
deallocation not matching &h00000001 ( 0.00 MB) 0.10 GB
228+
deallocation not matching &h083F3020 ( 0.00 MB) 0.10 GB
229+
memory deallocation &h020E0020 -99.00 MB 0.00 GB
230+
memory allocation &h020ED020 +103.00 MB 0.10 GB
231+
memory allocation &h087F2020 +106.00 MB 0.20 GB
232+
memory allocation &h0F20D020 +230.00 MB 0.43 GB
233+
memory allocation &h1D812020 +137.00 MB 0.56 GB
234+
memory allocation &h2612C020 +377.00 MB 0.93 GB
235+
memory allocation &h3DA30020 +275.00 MB 1.20 GB
236+
memory allocation &h4ED40020 +220.00 MB 1.41 GB
237+
memory allocation &h5C958020 +229.00 MB 1.64 GB
238+
239+
memory allocation failed &h00000000 ( 142.00 MB) 1.64 GB
240+
memory deallocation forced &h5C958020 -229.00 MB 1.41 GB
241+
memory deallocation forced &h4ED40020 -220.00 MB 1.20 GB
242+
memory deallocation forced &h3DA30020 -275.00 MB 0.93 GB
243+
memory deallocation forced &h2612C020 -377.00 MB 0.56 GB
244+
memory deallocation forced &h1D812020 -137.00 MB 0.43 GB
245+
memory deallocation forced &h0F20D020 -230.00 MB 0.20 GB
246+
memory deallocation forced &h087F2020 -106.00 MB 0.10 GB
247+
memory deallocation forced &h020ED020 -103.00 MB 0.00 GB
248+
end program forced
249+
%%
250+
Output for fbc 64-bit (maximum dynamic data < virtual memory).
251+
Here, program is stopped because of total allocated memory size > 3 GB (adjustable threshold):
252+
%%
253+
Message Address Size Total
254+
255+
memory allocation &h0000000001EA5040 +105.00 MB 0.10 GB
256+
memory allocation &h00000000087BC040 +93.00 MB 0.19 GB
257+
memory deallocation &h00000000087BC040 -93.00 MB 0.10 GB
258+
deallocation not matching &h0000000000000001 ( 0.00 MB) 0.10 GB
259+
deallocation not matching &h00000000087BC040 ( 0.00 MB) 0.10 GB
260+
memory deallocation &h0000000001EA5040 -105.00 MB 0.00 GB
261+
memory allocation &h0000000001EA1040 +155.00 MB 0.15 GB
262+
memory allocation &h000000000B9BF040 +165.00 MB 0.31 GB
263+
memory allocation &h0000000015ED8040 +382.00 MB 0.69 GB
264+
memory allocation &h000000002DCE7040 +458.00 MB 1.13 GB
265+
memory allocation &h000000004A6FB040 +255.00 MB 1.38 GB
266+
memory allocation &h000000005A607040 +96.00 MB 1.48 GB
267+
memory allocation &h000000006061B040 +426.00 MB 1.89 GB
268+
memory allocation &h000000007FFF9040 +221.00 MB 2.11 GB
269+
memory allocation &h000000008DD03040 +119.00 MB 2.22 GB
270+
memory allocation &h0000000095413040 +147.00 MB 2.37 GB
271+
memory allocation &h000000009E727040 +217.00 MB 2.58 GB
272+
memory allocation &h00000000AC03C040 +334.00 MB 2.91 GB
273+
memory allocation &h00000000C0E4B040 +280.00 MB 3.18 GB
274+
275+
memory allocation exceeded &h00000000C0E4B040 ( 280.00 MB) 3.18 GB
276+
memory deallocation forced &h00000000C0E4B040 -280.00 MB 2.91 GB
277+
memory deallocation forced &h00000000AC03C040 -334.00 MB 2.58 GB
278+
memory deallocation forced &h000000009E727040 -217.00 MB 2.37 GB
279+
memory deallocation forced &h0000000095413040 -147.00 MB 2.22 GB
280+
memory deallocation forced &h000000008DD03040 -119.00 MB 2.11 GB
281+
memory deallocation forced &h000000007FFF9040 -221.00 MB 1.89 GB
282+
memory deallocation forced &h000000006061B040 -426.00 MB 1.48 GB
283+
memory deallocation forced &h000000005A607040 -96.00 MB 1.38 GB
284+
memory deallocation forced &h000000004A6FB040 -255.00 MB 1.13 GB
285+
memory deallocation forced &h000000002DCE7040 -458.00 MB 0.69 GB
286+
memory deallocation forced &h0000000015ED8040 -382.00 MB 0.31 GB
287+
memory deallocation forced &h000000000B9BF040 -165.00 MB 0.15 GB
288+
memory deallocation forced &h0000000001EA1040 -155.00 MB 0.00 GB
289+
end program forced
290+
%%
291+
{{fbdoc item="lang"}}
292+
- Only available in the //[[CompilerOptlang|-lang fb]]// dialect.
293+
294+
{{fbdoc item="diff"}}
295+
- New to ""FreeBASIC""
296+
297+
{{fbdoc item="see"}}
298+
- ##[[KeyPgOpNew|New Expression]]##
299+
- ##[[KeyPgOpDeleteOverload|Delete Overload]]##
300+
- ##[[KeyPgAllocate|Allocate]]##
301+
302+
{{fbdoc item="back" value="CatPgOpMemory|Memory Operators"}}{{fbdoc item="back" value="CatPgOperators|Operators"}}

0 commit comments

Comments
 (0)