it works better now

For example:
1. You allocated 1k memory (addr: 0x8a92010)
2. You allocated 2k memory (addr: 0x8a92420)
3. You freed the memories that you already allocated at step 1-2
4. You allocated 3k memory (addr: 0x8a92010)

The difference between this and previous commit is that with previous code, the
addresses of memories that allocated in step 1 and 3 will not be same. And that
means a problem, because we freed all the memory that we allocated before, so a
new allocated memory should start from the beginning, not somewhere else.

Note: There are still so much thing to do/improve so it's not good enough. It
      can very easily turn into something complicated, so i have to make it
      cleaner and it seems like a good idea to add a few comments.

*sorry for bad English*