Memory Manager Library
This library provides routines for manipulating dynamic memory allocation. Dynamic memory allocation (also known as heap-based memory allocation) is the allocation of memory storage for use in a program during the runtime of that program.
Dynamically allocated memory exists until it is released. This is in contrast to static memory allocation, which has a fixed duration. It is said that an object so allocated has a dynamic lifetime.
The heap memory size can be configured in the Edit Project window. Also, user can override heap memory size in the code, by setting the HEAP_SIZE constant.
Library Routines
MM_Init
| Prototype |
sub procedure MM_Init() |
|---|---|
| Description |
Initializes the memory manager. |
| Parameters |
None. |
| Returns |
Nothing. |
| Requires |
Nothing. |
| Example |
MM_Init() ' Initializes memory manager |
| Notes |
None. |
GetMem
| Prototype |
sub procedure GetMem(dim byref P as ^byte, dim Size as longword) |
|---|---|
| Description |
Allocates a block of memory from the memory Heap. |
| Parameters |
|
| Returns |
Returns a pointer to the fetched memory (of "Size" bytes) in P, if success; Otherwise 0 (no free blocks of memory are large enough). |
| Requires |
Nothing. |
| Example |
GetMem(ptr,20*sizeof(PBuffer)) ' ptr will point to a memory block where PBuffer is allocated |
| Notes |
Following alignments are assumed :
It is recommended to use New routine instead. |
GetMemAlign
| Prototype |
sub procedure GetMemAlign(dim byref P as ^byte, dim Size as longword, dim alignment as byte) |
|---|---|
| Description |
Allocates a block of memory from the memory Heap. |
| Parameters |
|
| Returns |
Returns a pointer to the fetched memory (of "Size" bytes) in P if success; Otherwise 0 (no free blocks of memory are large enough). |
| Requires |
Nothing. |
| Example |
GetMemAlign(ptr,20*sizeof(PBuffer)); ' ptr will point to a memory block where PBuffer is allocated |
| Notes |
User must take care when specifing alignment parameter, as the compiler assumes that certain data types must be properly aligned. Having that in mind, it is advisable to use GetMem and New routines instead. |
Malloc
| Prototype |
sub function Malloc(dim Size as longword) as ^byte |
|---|---|
| Description |
Allocates a block of memory from the memory Heap, returning a pointer to the beginning of the block. The content of the newly allocated block of memory is not initialized, remaining with indeterminate values. |
| Parameters |
|
| Returns |
Returns a pointer to the memory block allocated by the function. If the function failed to allocate the requested block of memory, a zero is returned |
| Requires |
Nothing. |
| Example |
dim p as ^longword ' pointer to longword dim a as longword[100] ' array of longwords p = longword(Malloc(sizeof(a))) ' p will point to a memory block where the array is allocated |
| Notes |
None. |
FreeMem
| Prototype |
sub procedure FreeMem(dim byref P as ^byte, dim Size as longword) |
|---|---|
| Description |
This function is used to free memory block allocated by GetMem or Malloc. |
| Parameters | |
| Returns |
Nothing. |
| Requires |
Nothing. |
| Example |
FreeMem(ptr,20*sizeof(PBuffer)) ' ptr will point to a memory block where PBuffer is allocated |
| Notes |
None. |
Free
| Prototype |
sub procedure Free(dim byref P as ^byte, dim Size as longword) |
|---|---|
| Description |
This function is used to free memory block allocated by GetMem or Malloc. |
| Parameters |
|
| Returns |
Nothing. |
| Requires |
Nothing. |
| Example |
dim p as ^longword ' pointer to longword dim a as longword[100] ' array of longwords p = longword(Malloc(sizeof(a))) ' p will point to a memory block where the array is allocated Free(p, sizeof(p)) ' frees memory block from the Heap allocated by Malloc, pointed to by the p pointer |
| Notes |
None. |
MM_LargestFreeMemBlock
| Prototype |
sub function MM_LargestFreeMemBlock() as longword |
|---|---|
| Description |
This function is used to determine largest available free memory of contiguous memory on the heap. |
| Parameters |
None. |
| Returns |
Returns, after defragmentation of the freelist the size (in bytes) of the largest free block of contiguous memory on the heap. |
| Requires |
Nothing. |
| Example |
dim block as longword ... block = MM_LargestFreeMemBlock() |
| Notes |
None. |
MM_TotalFreeMemSize
| Prototype |
sub function MM_TotalFreeMemSize() as longword |
|---|---|
| Description |
This function is used to determine total free memory size on the heap. |
| Parameters |
None. |
| Returns |
Returns the size (in bytes) of the total free memory on the heap. |
| Requires |
Nothing. |
| Example |
dim total as longword ... total = MM_TotalFreeMemSize() |
| Notes |
None. |
Library Example
program MM_Example
' Structure that describes Item object
structure tItem
dim id as longword ' Item number
dim name as ^char ' Item name
end structure
dim it as ^tItem[3] ' Array of pointers to Item objects
dim txt as char[15]
dim freeMemSize as longword
dim largerstFreeBlock as longword
' Allocate and initialize a new Item object and returns pointer to created Item
sub function make_item(dim byref name as string) as ^tItem
dim item as ^tItem
item = malloc(sizeof(tItem)) ' Allocate a block of memory for a new Item object
if item = 0 then ' If allocation failed return null
result = 0
exit
end if
memset(item, 0, sizeof(tItem)) ' Initialize the members of the new Item
item^.id = longword(-1)
item^.name = 0
item^.name = malloc(strlen(name) + 1) ' Allocate a block of memory for a name in the Item
if item^.name = 0 then ' If allocation failed return null
Free(item, sizeof(tItem))
result = 0
exit
end if
strcpy(item^.name, name) ' Save a copy of the name in the new Item
result = item ' Return the created Item object
end sub
' Deallocate an Item object
sub procedure destroy_item(dim item as ^tItem)
if item = 0 then ' Check for a null object pointer
exit
end if
if (item^.name <> 0)then
Free(item^.name, strlen(item^.name) + 1)' Deallocate the name string saved within the Item
item^.name = 0
end if
Free(item, sizeof(tItem)) ' Deallocate the Item object itself
end sub
main:
MM_Init()
freeMemSize = MM_TotalFreeMemSize() ' Get free memory size before allocating
largerstFreeBlock = MM_LargestFreeMemBlock() ' Get largest free memory block size before allocating
it[0] = make_item("one") ' Allocate object
it[1] = make_item("two")
it[2] = make_item("three")
freeMemSize = MM_TotalFreeMemSize() ' Get free memory size
largerstFreeBlock = MM_LargestFreeMemBlock() ' Get largest free memory block size
strcpy(txt,it[0]^.name)
strcpy(txt,it[1]^.name)
strcpy(txt,it[2]^.name)
destroy_item(it[0]) ' Deallocate the Item object
it[0] = make_item("instead one") ' Make another Item object
strcpy(txt,it[0]^.name)
strcpy(txt,it[1]^.name)
strcpy(txt,it[2]^.name)
destroy_item(it[1]) ' Deallocate Items
destroy_item(it[2])
freeMemSize = MM_TotalFreeMemSize() ' Get free memory size
end.
What do you think about this topic ? Send us feedback!




