代码示例
- int main()
- {
- int size = 100;
- stringstream strStream;
- for (int i = 0; i < size; ++i)
- {
- strStream << i;
- string numStr;
- strStream >> numStr;
- strStream.clear();
- }
- printf("size=%d\n", strStream.str().capacity());
- return 0;
- }
现象&后果
从打印的信息看,strStream占用的内存空间在持续增长。当size较大时,程序消耗内存将迅速增长。
Bug分析
上述代码中,在for循环中每次调用strStream.clear()是希望在每次使用完strStream之后清理strStream占用的资源,但stringstream的clear方法并没有真正地释放strStream占用的空间,这样strStream所占用的空间一直在增长。当size较大时,strStream消耗的内存迅速增长,可能出现严重问题。
实际上,如果希望strStream释放空间,可以调用str("")方法来重置stringstream占用的内存。
正确代码
- int main()
- {
- int size = 100;
- stringstream strStream;
- for (int i = 0; i < size; ++i)
- {
- strStream << i;
- string numStr;
- strStream >> numStr;
- strStream.str("");
- }
- printf("size=%d\n", strStream.str().capacity());
- return 0;
- }
编程建议
使用stringstream对象可以简化类型转换,如上面例子代码中int到string的转换,但在多次转换中,使用同一个stringstream对象,需要使用其对象方法str来重置stringstream的buffer,这样能确保stringstream占用的内存不会越积越多。