#include <iostream>
#include <sstream>
#include <cassert>

int main(int, char *[])
{
std::ostringstream os;
os << "foo";
assert( os.str() == "foo");
os.str("");
assert( os.str().empty() );
std::streambuf *lastbuf = std::cout.rdbuf(os.rdbuf());
std::cout << "foo";
assert( os.str() == "foo" );
std::cout.rdbuf(lastbuf);
}

できました!
理由はよくわかりませんが元のstreambuf*を戻してやる必要があるみたいです
(ref http://bytes.com/forum/thread133393.html)