For string storage, most people want a compactor for the memory block you are using as the storage "pool". You can, of course, "cheat" and use the Windows CString/BSTR interfaces to handle the string management for you.
If you are compacting, you can either use mark and sweep, copy collection, reference counting, or you can compact using sorted string addresses. You need to know where all of the string addresses are. If you like, you can check address ranges so that you do not copy constant strings.
If you don't mind the extra overhead, you can use double indirection to simplify compaction. The variables point to the string addresses, so that the compactor can change string addresses without changing the values stored in variables. If you don't like double indirection, you'll need a way to know where all the string variables are.
Unfortunately, I don't have any links that show memory management schemes for strings. There are many solutions. It's basically keeping track of what string memory is still available, and discovering what data is no longer in use (and therefore is contained in recoverable memory). The various solutions optimize the storage, allocation, or collection in different ways.
Here are some links for general purpose GC...http://www.memorymanagement.org/articles/recycle.htmlhttp://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29
If you are interested in books, Garbage Collection
by Jones & Lin is very comprehensive.