CONTENTS | PREV | NEXT
4K. dynamic memory allocation (NEW)
-----------------------------------
the NEW operator is a powerful operator for dynamic memory allocation.
it has various forms:
(assuming DEF p:PTR TO whateverobj, q:PTR TO INT)
NEW p
is an expression that will allocate zero-ised memory for the object-size
p points to. the resulting pointer will be put in p, and is also
the value of the expression. if NEW fails to get memory, it raises
a "NEW" exception. 'NEW p' is therefore roughly equivalent with:
IF (p:=New(SIZEOF whateverobj))=NIL THEN Raise("MEM")
with the difference that p never gets any value if an exception
is raised, and that the former is of course an expression, not
a statement
but there's more: it's also possible to allocate an array dynamically:
NEW p[10] /* array of 10 objects */
NEW q[a+1] /* array of INT, size is runtime computed */
(this doesn't work when instantiating classes)
A problem with list [1,2,3] expressions sometimes is that they are static, and
when using these to build large datastructures they would need to be created
at run-time. The dynamic equivalent to static lists may then be used:
p:=[1,2,3]:whateverobj /* static structure */
p:=NEW [1,2,3]:whateverobj /* dynamicly allocated! */
this works with both lists and typed-lists, and also with arrays:
NEW [1,2,3] /* constant-list, dyn. (note: not a like a listvar!) */
NEW [1,2,3]:obj /* object */
NEW [1,2,3]:INT /* array of INTs */
freeing memory allocated with any variations of NEW is done automatically
at the end of the program, or by hand with END or FastDispose().
(note: the only exception is NEW <list>, use FastDisposeList())
If you use NEW [...]:obj, and the number of fields is less than the one
present in the object, additional 0/NIL/"\0" whatever fields will be added.
this allows extending objects without getting into trouble with allocations
like these. (note that this is different from the static [...]:obj)
when you use NEW as a statement, multiple pointers may follow, i.e.:
NEW a,b.create(),c
is valid.
special forms of NEW and END allow to use a PTR within an object, so you can
write things like
NEW a.b.create()
NEW a.b[50]
END a.b
in the examples, the pointer `a' is not affected, the pointer `b' in the `a'
object is used.
NEW allocated lists are not to be used with the Link() functions (see 9H ).
(see 5M , END)
(see 9F for the fast memory allocation functions NEW makes use of)