将 wostringstream 转换为 wchar_t* 乱码值

Converting wostringstream to wchar_t* Garbles Values

本文关键字:wostringstream 转换 wchar      更新时间:2023-10-16

我正在尝试生成一个字符串并将其分配给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对象,并仅在实际需要时才检索其数据指针。