我有很多单元测试通过valgrind运行。
总共有15个测试,都使用相同的基类(Foo
),它具有std::string
成员(value_
)和虚拟析构函数。
所有单元测试都通过,析构函数被调用15次,但是valgrind报告该字符串的泄漏8次(15次测试中有8次)。
所有8个报告的泄漏都是指相同的字符串
==30881== 29 bytes in 1 blocks are definitely lost in loss record 8 of 8
==30881== at 0x4A07D73: operator new(unsigned long) (vg_replace_malloc.c:332)
==30881== by 0x3AEF09C3C8: allocate (new_allocator.h:89)
==30881== by 0x3AEF09C3C8: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) (basic_string.tcc:608)
==30881== by 0x3AEF09DDA9: std::string::_M_mutate(unsigned long, unsigned long, unsigned long) (basic_string.tcc:480)
==30881== by 0x3AEF09DF6B: std::string::_M_replace_safe(unsigned long, unsigned long, char const*, unsigned long) (basic_string.tcc:685)
==30881== by 0xBFB67D: test::TestFoo::TestFoo() (test_foo.h:26)
test_foo.h
中的第26行是分配字符串的位置:
TestFoo()
{
value_ = "test"; // line 26
}
我在Foo
析构函数(TestFoo
的基类)中添加了以下“check”/“hack”:
virtual ~Foo()
{
LOG_TRACE("value capacity(%lu)", value_.capacity());
std::string().swap(value_); // force memory to be released
LOG_TRACE("value capacity(%lu)", value_.capacity());
}
在我的日志文件中,我验证了Foo
析构函数被调用了15次,并且每次都会将容量降低到0。
|01:13:59.477486350| {TRACE} [Foo::~Foo] value capacity(4)
|01:13:59.479293212| {TRACE} [Foo::~Foo] value capacity(0)
失败的环境:
请注意,在另一台计算机上,此故障不会发生(Ubuntu 16.04 with gcc 5.4,但是相同版本的valgrind)
问题:
是否可以修复此问题,以便valgrind不会认为内存泄漏,而不使用抑制文件?