好一段时间没有写c++了,最近计划写一个日志收集及分析系统,发现有点手生,还被sstream坑了好久,以往有过注意,但时间久了,就忘记了,现记录如下:
1. 坑一
stringstream来自头文件<sstream>,它的方法str()实际是进行了一次内存拷贝,返回了一个临时对象,所以就会有如下的问题:
stringstream ss;
ss << "abc";
const char *ptr = ss.str().c_str(); //错误
const string &str = ss.str();
const char *ptr = str.c_str(); //正确
str()的函数注释为:Copying out the string buffer.
2. 坑二
stringstream的clear方法不是用来清空内存的,而是用来清除错误状态的,该方法继承于basic_ios,比如使用stringstream进行格式转换时出错了,判断完状态值后,需要继续操作,就需要先clear一把。如果是想清空内存,应该使用str(""),即拷贝一个"\0"就完成清空了。