CppUtest发现的STL容器内存泄漏问题

今天在给代码做UT时,某个case 中报出有内存泄露,提示信息可以看出泄漏的大小但没有具体位置。定位问题的方法不再细述,主要是通过缩减代码,逐步定位泄露地点。事后为了便于说明问题,写了两个小巧的case,你能从下面两个case中看出哪个存在内存泄露吗?
std::string g_leak_str; // 定义一个全局string 变量
...
TEST(mt_adaptor, leak01)
{
   g_leak_str = "Hello World!";
   g_leak_str.clear();
}


TEST(mt_adaptor, leak02)
{
   g_leak_str = "Hello World!";
   std::string().swap(g_leak_str);
}

答案是case01存在内存泄露。错误提示信息如下:

../../tst/src/mt_adapt.cpp:232: error: Failure in TEST(mt_adaptor, leak01)
     Memory leak(s) found.
Alloc num (6194) Leak size: 37 Allocated at: <unknown> and line: 0. Type: "new"
     Memory: <0xedbf10> Content: ""
Total number of leaks:  1

其实问题的关键是STL中内存分配策略及回收策略,具体参考《C++ Primer》,这里简单提一下,当为string变量赋值时,如果该变量内存不够会触发malloc为该变量分配更多的内存,也就是错误提示中提到的“new”。clear()方法只是把存储内容清空,已经存在的内存不会释放,这也就是CppUTest认为存在内存泄漏的原因,即CppUTest在该case结束时发现堆空间变小了。case leak02所示方法,通过与一空匿名string变量交换,也实现了内存释放。待case结束时匿名string也会自然消亡,所占内存也会释放,所以没有问题。 


这里以string对象举例,STL中定义的其他容器也有类似的问题。

补充一句,这种情况不是严格意义上的内存泄漏,因为内存还在管控之中,但是在用完某个对象后将其恢复原样永远没错。

转载于:https://my.oschina.net/renhc/blog/314115

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值