首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Converting流转换为wchar_t* Garble值

将Converting流转换为wchar_t* Garble值
EN

Stack Overflow用户
提问于 2014-12-31 00:38:37
回答 1查看 749关注 0票数 0

我正在尝试生成一个字符串并将它分配给一个wchar_t*,但是当我去分配它时,似乎有些东西在混淆它。下面是一个简化的复制:

代码语言:javascript
复制
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() (无论是在指针测试之前还是之后)时,数据才会在正确的位置结束。问题是,我不知道什么会导致这种行为.

如果是相关的话,这都是在第二个线程上运行的,但我不认为这会有什么关系,因为我只处理局部变量。有什么想法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-31 00:41:07

wostringstream::str()方法按值返回std::wstring。您没有将它分配给任何东西,因此它的生存期是临时的,并且在表达式完成时结束。您正在调用std::wstring::c_str()以保存指向临时数据的指针,然后临时将被销毁,留下一个偏离指针,从而导致后续代码中的http://en.wikipedia.org/wiki/Undefined_behavior

与其保存std::wstring的数据指针,不如保存实际的std::wstring对象,并仅在实际需要时检索其数据指针。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27714663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档