在使用数据库插入语句,用string的+=拼接sql语句的时候,终于发了内存泄漏!!!!
1.发现问题。
测试软件发现内存一直在增长,把所有的new的地方都检查了一遍,一个指针都没放过,最最最后在string的+=这一块代码发现了问题。
_str += (" values (" + to_string(t->ts) + "," + to_string(t->data_value.value_float)
1. "," + to_string(t->data_value.value_float) +"," + to_string(t->data_status)+
2. "," + to_string(++i) + ") ");
-
自我怀疑。
起初是以为string需要自己释放,其实我也不敢相信,我产生了程序员的自我怀疑;我去每个string使用完后clear,但是调试的时候发现,clear之后任然会出现内存泄露。 -
抓狂。
开始考虑string本身的结构有问题,虽然clear了但是内存可能还没被释放,使用网上说所shrink_to_fit()的string自带函数对clear的地方,再进行一次shrink_to_fit();任然没有解决问题。 -
求助高手。
我把上面相关代码段落注释掉,内存不泄露,开放泄露,这一现象给了旁边的高手看;高手一边调试一边说,存放sql语句的结构体的queue有没有释放?
好吧,又开始倒腾,希望能有结果,结果依然存在内存泄漏。 -
开始发呆,思考人生。
对着代码发呆,思考人生。根本想不明白为什么。 -
开始摆烂。
开始研究其他项目。最后一位扫地僧说了一句要不考虑用一下append? -
尝试append。
修改+=为append;
_str.append("(values (");
_str.append(to_string(t->ts));
_str.append(",");
_str.append(to_string(t->data_value.value_float));
_str.append(",");
_str.append(to_string(t->data_value.value_float));
_str.append(",");
_str.append(to_string(t->data_status));
_str.append(") ");
居然内存泄露解决了。开始查找资料关于string的+=使用发现:string使用+=的时候由于前面的对象长度不够,可能需要再栈上申请新的空间加上后的字符串,但是之前的对象没有被释放,久而久之,如果像我一样用+=来拼接成千上万的sql语句,内存泄漏导致的问题就非常明显。
- 总结以后再也不用+=,用append了,不,再也不用string了,等我什么时候后悔了再用。