The Delphi memory manager does not release all unused memory to the operating system. Fragmentation can also kick in very badly. Both depend on the actual memory manager you use (FastMM is usually better than the stock memory manager in D7, but any memory manager can be brought to it's knees by using a memory manager specific series of memory usage patterns). Furthermore, WideStrings, though they are COM strings, are not reference counted, and might not be released even later than the normal strings.
The only reliable way to query actual memory message in Delphi is to ask the memory manager your Delphi program uses.
This function in the System unit does that for you:
function GetHeapStatus: THeapStatus
--jeroen
edit: 20100104 in reaction to comment by Marco:
(FastMM is usually better than the stock memory manager in D7, but any memory manager can be brought to it's knees by using a memory manager specific series of memory usage patterns)