This is an interesting question. My original take on your question was whether or not you could access memory after program completion, but after a second read I see you want to know why memory should be freed.
You free dynamically allocated memory, because if you don't the OS and other process will run out and you will have to reboot.
I thought you might want to access that memory after program completion, so my guess is that even if you wrote out the starting address and length of a dynamically allocated memory block -- to the console or a file -- that address might not be valid after the program completion.
That is because when your program is running you have a virtual page address, which you either might not be able to touch without kernel privileges after program completion. Or, there is another reason.