stringstream string char* convert 转换陷阱

stringstream string char* convert 转换陷阱

c++中字符流操作类stringstream可以说是非常的便利,然而正确使用也是非常重要的!!!
看如下Demo:

可以猜猜,输出结果,是不是你想要的结果…

好吧,注释已经把结果说出来了

再看一个

使用vs 2015编译输出结果如下:

到这里想必能猜出个为什么吧?stringstream.str()执行后得到一个临时string对象,表达式执行完毕后会销毁掉,内存里头内容全部失效,所以
const char* cstr4 = ss.str().c_str(); 执行完毕后临时对象销毁,cstr4所指向的内存内容实际上是失效的,即所谓的 garbage,当使用cstr4的时候就出现问题了

stringstream.str() returns a temporary string object that’s destroyed at the end of the full expression. If you get a pointer to a C string from that (stringstream.str().c_str()), it will point to a string which is deleted where the statement ends. That’s why your code prints garbage.

解决办法

  1. 只使用一次,每次使用的重新转换一遍

这种方法简单,但是缺点很明显,每次使用都要重新生成一个临时对象,性能上有些开销

  1. 使用一个string接收临时对象,拷贝其内容,延长生命周期,多次使用

发表评论

电子邮件地址不会被公开。 必填项已用*标注

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax