【发布时间】:2011-11-04 15:42:07
【问题描述】:
我们看到了一个奇怪的场景,基本上可以归结为以下几点:
std::string something = "someval";
std::stringstream s;
s << something;
std::cout << s.str();
不等于:
std::string something = "someval";
std::stringstream s;
s << something.c_str();
std::cout << s.str();
更进一步——无论哪种情况,输出都不是乱码。发生的情况是案例 1 的输出似乎映射到系统中的另一个(有效)字符串,而案例 2 的输出是预期的。
我们通过简单的改变就能看到这种行为:
s << something;
收件人:
s << something.c_str();
我知道这听起来很疯狂(或者对我来说确实如此),而且我无法将它复制到更大的系统之外 - 很抱歉没有“工作”示例。但是有谁知道这种事情怎么会发生?我们可以在某处踩内存或对某个位置的字符串表或其他类似的东西做某事吗?
【问题讨论】:
-
贴出真实的代码来显示差异!
-
实际代码中的 something 字符串是否包含嵌入的 nul 字符?
-
如果您正在破坏内存或以某种方式调用未定义的行为,那么可能的原因几乎是无限的。可能它们都与
stringstream类无关,这只是巧合。 -
是的。
something或s可能会被毁掉。给我带来麻烦的两件事:A.this在我尝试对成员进行操作时实际上已被删除,以及 B. 我无意中链接到标准库的不同变体(调试/发布或类似的混合)我正在尝试使用由一个实现创建的std::string,就好像它是另一个实现一样。 -
选项 2 在我的情况下无法编译:
s << something.c_str()导致error C2297: '<<' : illegal, right operand has type 'const char *'(MS Visual Studio 2008,#include<string>包含的字符串)