将wostringstream转换为wchar_t*Garbles值

Moo*_*oys 0 c++ string unicode

我正在尝试生成一个字符串并将其分配给一个字符串,wchar_t*但是当我去分配字符串时似乎正在填充字符串.这是一个简化的复制品:

wostringstream woss;
woss << L"Test String";

// A: this doesn't work:
const wchar_t* foo = woss.str().c_str();
wcout << foo << endl; // "????????????????????????"

// B: this works:
wstring bar = woss.str();
const wchar_t* foo = foo.c_str();
wcout << foo << endl; // "Test String"

// C: this also works!?:
const wchar_t* foo = woss.str().c_str();
wstring bar = woss.str();
wcout << foo << endl; // "Test String"
Run Code Online (Sandbox Code Playgroud)

当我一次完成转换时(如在A中),指向的结果值foo是一堆0xFEEE字符.如果我一步一步地做(如在B中),字符串最终会很好.最奇怪的是,如果分配之后,我评估woss.str(),foo突然变为有效的数据(如在C中).

这让我觉得链式赋值会以某种方式返回指向字符最终去的位置的指针,但它以某种方式跳过实际的评估,str()因此实际上并没有填充值.只有在我调用str()(在指针分配之前或之后)数据才会在正确的位置结束.问题是,我不知道会导致这种行为的原因是什么......

如果它是相关的,这都是在辅助线程上运行,但我不希望这是重要的,因为我只处理局部变量.思考?

Som*_*ude 6

wostringstream::str()方法返回一个std::wstring by值.您没有将其分配给任何内容,因此它的生命周期是临时的,并在表达式完成时结束.您正在调用std::wstring::c_str()保存指向临时数据的指针,然后临时被破坏,留下一个迷路指针,从而导致后续代码中出现未定义的行为.

不是保存std::wstring数据指针,而是保存实际std::wstring对象,并仅在实际需要时检索其数据指针.