我正在查看一些遗留代码,并且有相当多的stringstream
用法。到目前为止,代码通常从各种类型生成消息。除了在某些情况下执行以下操作之外:
std::ostringstream f1;
f1 << sDirectory << mFileName << sFileExtension << '\0';
和其他人做(只是说明)
std::ostringstream f1;
f1 << sDirectory << mFileName << sFileExtension << std::ends;
我相信这些调用是因为它进一步访问f1.str().c_str()
并且需要null来终止它。
这些电话有什么不同吗?我从http://en.cppreference.com/w/cpp/io/manip/ends看到std :: ends没有刷新,std :: end在不同的平台上是不同的(Linux / Windows / Mac)?我应该更喜欢一个吗?
除此之外,我读到在作用域后面的字符串流上应该调用freeze(false)
(在使用str()
之后)以允许释放缓冲区(http://en.cppreference.com/w/cpp/io/ostrstream/freeze) 。再次(可能是我误读或误解)但是没有调用freeze(false)
所以这表明上面的每个流都在泄漏?
N.B。仅供参考这是Visual Studio 2005 / Windows 7,但我不知道是否有任何影响。
道歉,如果我是密集的......
答案 0 :(得分:1)
std::ends
被定义为具有以下效果:
在输出序列中插入一个空字符:调用
os.put(charT())
。
charT
为char
时,值初始化为值0,等同于字符文字\0
。因此,当charT
为char
时,它通常是两行代码完全相同。
但是,即使您的信息流的字符类型不是std::ends
,使用char
也能正常运作。