文档章节

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

恋恋美食
 恋恋美食
发布于 2014/09/16 15:28
字数 499
阅读 883
收藏 1
今天在给代码做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中定义的其他容器也有类似的问题。

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

© 著作权归作者所有

恋恋美食

恋恋美食

粉丝 102
博文 138
码字总数 127889
作品 0
杭州
高级程序员
私信 提问
CppUTest 入门教程

首次测试 在做第一次测试的时候,你需要新建一个cpp文件,并写好TEST_GROUP和TEST方法,如下: 很明显此次测试将失败。我们再添加一个新的测试组,并确保它能编译通过。如果此时你想添加其他...

迷途d书童
2012/05/03
6.9K
3
内存泄露:a CDynLinkLibrary object at...的解决

这两天在设计一个项目,独立了几个DLL模块。昨天勉强把前段工作做完了,需要的DLL也都挂进了EXE文件之中,暗自高兴了一把。不过晚上在看的时候,发现VS2005输出窗口提示有内存泄露: a CDyn...

郭廷钧
2011/01/29
0
0
在 Linux 平台中调试 C/C++ 内存泄漏方法

由于 C 和 C++ 程序中完全由程序员自主申请和释放内存,稍不注意,就会在系统中导入内存错误。同时,内存错误往往非常严重,一般会带来诸如系统崩溃,内存耗尽这样严重的 后果。从历史上看,...

Dicky
2011/09/25
0
0
c/c++服务器程序内存泄露问题分析及解决

由 www.169it.com 搜集整理 对于一个c/c++程序员来说,内存泄漏是一个常见的也是令人头疼的问题。已经有许多技术被研究出来以应对这个问题,比如 Smart Pointer,Garbage Collection等。Sma...

小星星程序员
2014/11/04
0
0
《Effective STL》读书总结--关于STL 你不一定都懂的

春节期间一次用手机上网无意间发现了这本书,说起来还得感谢智能手机的发展,有时候还是很方便的。当时随便的翻了几页,于是我停不下来了,因为我发现原来我不知道的东西太多了。 我第一次接...

长平狐
2012/06/08
122
0

没有更多内容

加载失败,请刷新页面

加载更多

对话亲历者|鲁肃:我在支付宝“拧螺丝“的日子

摘要: 他是支付宝技术平台的奠基人之一,但是他总说“这还不是我心中最完美的架构”;他行事低调但却有着“此时此地,非我莫属”的豪气;他曾无数次充当救火大队长,但自评只是“没有掉队的...

阿里云云栖社区
25分钟前
4
0
设置 npm yarn 淘宝源

设置npm config set chromedriver_cdnurl=http://cdn.npm.taobao.org/dist/chromedriver设置yarn config set "chromedriver_cdnurl" "https://npm.taobao.org/mirrors/chromedriver"......

internetafei
34分钟前
2
0
Docker搭建Mysql集群、主从同步复制

1、创建数据挂载点: mkdir /opt/mysql-master/mysql、/opt/mysql-master/conf.d、/opt/mysql-slave/mysql、/opt/mysql-slave/conf.d 2、分别在master、slave节点文件目录conf.d下创建touch......

WALK_MAN
57分钟前
11
0
手把手教你做中间件开发(分布式缓存篇)-借助redis已有的网络相关.c和.h文件,半小时快速实现一个epoll异步网络框架,程序demo

本文档配合主要对如下demo进行配合说明: 借助redis已有的网络相关.c和.h文件,半小时快速实现一个epoll异步网络框架,程序demo 0. 手把手教你做中间件、高性能服务器、分布式存储技术交流群 ...

y123456yz
58分钟前
3
0
Spring-boot单元测试(私有方法测试)

Spring-boot的单元测试网上有了很多,当项目是可以使用spring-boot正常运行时,只要在测试类上添加如下配置就使用@Autowired的方式进行单元测试 @RunWith(SpringJUnit4ClassRunner.class)@...

琴兽
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部