std::string内存泄露问题之分析解决

std::string使用错误导致的内存泄露分析

参考链接:
http://www.cppblog.com/qinqing1984/archive/2009/08/07/92479.html

复原

在一次编程中,对性能进行测试发现有明显的内存泄露,定位到一个函数获取字符串赋值给一个string对象,屏蔽这行,就没有内存泄露,或者使用cout打印下这个string对象,内存也不泄露,特别诡异

解决方法

在调查后发现,这个string对象在一开始被我使用memset初始化为0,然后导致内存泄露,将memset函数去除后,内存泄露问题解决

原因

经过一番源代码跟踪调试后,发现原因在于TOWER_INFO结构体的构造函数内调用了
memset(this, 0, sizeof(_TOWER_INFO);使得string内部指针_Bx._Ptrr值为0,_Myres为0,在这种情况下当string对象被赋值为小字符串(字节数包括结束符小于等于16的字符串)时,因新申请的内存在后来得不到释放,所以这块内存被泄露了,
根据string类内存管理算法(ms vc版本)得知这块内存大小总是16个字节.但当被赋值为大字符串(字节数包括结束符大于16的字符串)时,反而没有内存泄露,这是因为新申请的内存在析构或下次赋值时总能被释放.

总结:

不要轻易零初始化string, vector等stl标准容器及具有动态内存管理的类。

猜你喜欢

转载自blog.csdn.net/libinbin_1014/article/details/79280861