There are many tools to track the memory status of a Delphi application. During the development of a project, I had to write such a tool, and afterward I made it available.
I've written a custom memory manager that plugs into Delphi's default memory manager, keeping track of all memory allocations and de-allocations. In addition to reporting the total number (something Delphi also does now by default), it can save a detailed description of the memory status to a file.
Memory Snap keeps in memory a list of allocated blocks (up to a given total number, which can be easily varied), so that it can dump the contents of the heap to a file with a low-level perspective. This list is generated by examining each memory block and determining its nature with empirical techniques you can see in the source code (although they are not easy to understand). The output is saved in a file, because this is the only activity that doesn't require a memory allocation that would affect the results. Here is a snippet of a sample file:
157) 00C035CC: object: [TList - 16] 158) 00C035E0: buffer with heap pointer [00C032B0] 159) 00C03730: string: [5-1]: Edit1 160) 00C03744: object: [TEdit - 544] 161) 00C03968: object: [TFont - 36] 162) 00C03990: object: [TSizeConstraints - 32] 163) 00C039B4: object: [TBrush - 24] 164) 00C039F4: buffer with heap pointer [00C01FE4] 165) 00C03B34: buffer with heap pointer [00C01F18] 166) 00C03B48: string: [0-0]: dD 167) 00C03B58: string: [11-2]: c:\mman.log
The program could be extended to profile memory usage by type (strings, objects, other blocks), track unreleased blocks, and keep memory allocations under control.
Again, the source code of this component is freely available in the Tools folder of the book's source code.