If you do this:
some_text = str_dup( "hi mom!" );
then you are losing control of whatever "some_text" was pointing to before. Now if that happened to have been pointing at some dynamically-allocated memory, and you now no longer have any references at all to that memory, then yes you just caused a memory leak, and you should have freed the string first.
If however it was pointing to (a) a static variable, (b) something else that will be garbage-collected later by another process you wrote (e.g. a heap manager), or (c) nothing, then you don't need to free_string() first because you haven't yet lost control of the memory that was being pointed to.
G