Другой ответ правильно относится к how does this program segfault
части вашего вопроса. Однако я чувствую, что реальный вопрос Redirecting stderr to stdout using string stream..
заслуживает лучшего ответа:
Вы можете упростить весь shebang, сделать его масштабируемым и лучше работать, просто наложив псевдоним cerr на cout:
#include <iostream>
int main()
{
std::cerr.rdbuf(std::cout.rdbuf());
std::cerr << "this goes to cerr";
}
Если вы действительно хотите быть явным:
std::cerr.copyfmt(std::cout);
std::cerr.clear(std::cout.rdstate());
std::cerr.rdbuf(std::cout.rdbuf());
Вы можете проверить, что текст действительно получен на стандартный вывод при запуске