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标准容器及具有动态内存管理的类。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值