当我明确释放内存时,valgrind报告std :: string泄漏

时间:2017-09-29 15:32:29

标签: c++ valgrind

我有很多单元测试通过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)

失败的环境:

  • CentOS版本6.4(最终版)
  • g ++(GCC)5.2.1 20150902(Red Hat 5.2.1-2)
  • 的valgrind-3.11.0
  • Linux版本2.6.32-696.6.3.el6.x86_64(mockbuild@c1bl.rdu2.centos.org)(gcc版本4.4.7 20120313(Red Hat 4.4.7-18)(GCC))#1 SMP 7月12日星期三14:17:22 UTC 2017

请注意,在另一台计算机上,此故障不会发生(Ubuntu 16.04 with gcc 5.4,但是相同版本的valgrind)

问题:

是否可以修复此问题,以便valgrind不会认为内存泄漏,而不使用抑制文件?

0 个答案:

没有答案