Its something I have usually seen with dialects of basic and if you have a start and end as in a normal procedure, you have an array of pointers and for each array member, you have dynamic allocation of whatever memory amount is required.
On the up side, the assembler/compiler counts the number of strings, allocates an array of that count then as required, each array member is a handle to any allocation required.
At the exit end, the array is scanned and for each member, it deallocates that memory and when that is completed, the pointer array is deallocated as well. The exit end is the garbage collection.