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中定义的其他容器也有类似的问题。
补充一句,这种情况不是严格意义上的内存泄漏,因为内存还在管控之中,但是在用完某个对象后将其恢复原样永远没错。