If you're not in C++11, then consider returning by value anyway. RVO will most likely avoid the copy anyway. That said, (I wish unique_ptr emulation was in boost) I get it why use shared_ptr even though you don't share anything...
Or maybe return a boost::container::vector<char> in C++98? It's movable, you know ;-)