我正在尝试生成一个字符串并将其分配给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"
当我一次完成转换时(如 A ),foo
指向的结果值是一堆0xFEEE
个字符。但是,如果我一步一步地进行(如 B ),字符串就会很好。最奇怪的是,如果在分配后,我评估woss.str()
,foo
指向的数据突然变为有效(如 C )。
这让我认为链式赋值会以某种方式返回一个指向字符最终去的位置的指针,但它以某种方式跳过str()
的实际评估,因此实际上并没有在那里填充值。只有在我调用str()
时(在指针分配之前或之后),数据才会在正确的位置结束。问题是,我不知道会导致这种行为的原因......
如果它是相关的,这都是在辅助线程上运行,但我不希望这是重要的,因为我只处理局部变量。想法?
答案 0 :(得分:6)
wostringstream::str()
方法按值返回std::wstring
。您没有将其分配给任何内容,因此它的生命周期是临时的,并在表达式完成时结束。您正在调用std::wstring::c_str()
来保存指向临时数据的指针,然后临时被破坏,留下一个迷路指针,从而在后续代码中导致undefined behavior。
不是保存std::wstring
的数据指针,而是保存实际的std::wstring
对象,并仅在实际需要时检索其数据指针。