Nearly every programming language has some features to track memory allocations. Some, like the C programming language, are primitive. In Chapter 14, we learned how to implement basic procedures for allocating and deallocating memory for a program and managing the amount of memory we requested from the kernel.
However, even with having functions to allocate and deallocate memory, there are still a lot of issues that programmers have when tracking memory. Trying to figure out when a piece of memory can