将 wostringstream 转换为 wchar_t* 乱码值
Converting wostringstream to wchar_t* Garbles Values
我正在尝试生成一个字符串并将其分配给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()
(在指针断言之前或之后)时,数据才会在正确的位置结束。 问题是,我不知道是什么会导致这种行为......
如果它是相关的,这一切都在辅助线程上运行,但我不希望这很重要,因为我只处理局部变量。 思潮?
wostringstream::str()
方法按值返回std::wstring
。 您没有将其分配给任何内容,因此其生存期是暂时的,并在表达式完成时结束。 您调用 std::wstring::c_str()
来保存指向临时数据的指针,然后临时数据被销毁,留下一个杂散指针,从而导致后续代码中出现未定义的行为。
不要保存std::wstring
的数据指针,而是保存实际的std::wstring
对象,并仅在实际需要时才检索其数据指针。