在代码中经常会使用ostringstream格式化字符串,用ostringstream.str()取得格式化后的结果字符串,但ostringstream.str()返回的是一个临时对象,在代码中必须注意临时对象的生存时间。
(vs2005)ostringstream类成员函数str()的定义为:
... { // return string copy of character array
return (_Stringbuffer.str());
}
_Stringbuffer定义为:
typedef basic_stringbuf < _Elem, _Traits, _Alloc > _Mysb;
basic_stringbuf::str()定义为:
... { // return string copy of character array
if (!(_Mystate & _Constant) && _Mysb::pptr() != 0)
... { // writable, make string from write buffer
_Mystr _Str(_Mysb::pbase(), (_Seekhigh < _Mysb::pptr()
? _Mysb::pptr() : _Seekhigh) - _Mysb::pbase());
return (_Str);
}
else if (!(_Mystate & _Noread) && _Mysb::gptr() != 0)
...{ // readable, make string from read buffer
_Mystr _Str(_Mysb::eback(), _Mysb::egptr() - _Mysb::eback());
return (_Str);
}
else
...{ // inaccessible, return empty string
_Mystr _Nul;
return (_Nul);
}
}
最后返回的都是一个临时对象。
用vs2005测试,程序如下:
#include < sstream >
using namespace std;
int main()
... {
ostringstream ss;
ss << "hello " << endl;
cout << "ss: " << ss.str().c_str();
const char* p = ss.str().c_str();
cout << "p: " << p;
cout << endl;
return 0;
}
输出:
p:
ss.str()返回的临时对象实际上在“const char* p = ss.str().c_str()”执行完就释放了,所以“cout << p”没有任何输出。这里“cout << p”输出为空只是巧合,也可能输出为乱码。
解决方法:
1.用string对象存储
string str = ss.str();
cout << str.c_str();
2.用const引用这个临时对象,可将临时变量的生存期延长到const 变量的作用域结束
const string& str = ss.str();
cout << str.c_str();
ps:
baidu找资料的时候搜索到这个链接:http://www.cppblog.com/chengmeng/archive/2006/09/04/12024.html,在评论栏里赫然有连文兄的大名。顺藤摸瓜,找到他的blog:http://www@cppblog@com/wlwlxj/。哈哈,沧海一声笑,世界真奇妙。看了他和婧姐的事情,唏嘘不已。