https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89303

            Bug ID: 89303
           Summary: memory leak with shared_ptr and
                    enable_shared_from_this
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: adl at gnu dot org
  Target Milestone: ---

I'm not sure if this issue is compiler or library related, but since changing
-O into -O0 or -O2 hides the issue, I'm assuming its the compiler.

This is g++ 8.2.0-20 from Debian unstable (SVN 20190209 (r268721) from the
gcc-8-branch) running on amd64.


% cat issue.c
#include <memory>

class blob final: public std::enable_shared_from_this<blob>
{
  int* data;

public:
  blob() { data = new int; }
  ~blob() { delete data; }
};

static int
bar(std::shared_ptr<blob>)
{
  return 0;
}

int main()
{
  std::shared_ptr<blob> tg = std::make_shared<blob>();
  return bar(tg);
}
% g++ -Wall -g -O issue.cc
% valgrind -q --leak-check=full ./a.out
==13174== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
==13174==    at 0x4835DEF: operator new(unsigned long)
(vg_replace_malloc.c:334)
==13174==    by 0x1092F5: allocate (new_allocator.h:111)
==13174==    by 0x1092F5: allocate (alloc_traits.h:436)
==13174==    by 0x1092F5:
__allocate_guarded<std::allocator<std::_Sp_counted_ptr_inplace<blob,
std::allocator<blob>, (__gnu_cxx::_Lock_policy)2> > > (allocated_ptr.h:97)
==13174==    by 0x1092F5: __shared_count<blob, std::allocator<blob> >
(shared_ptr_base.h:675)
==13174==    by 0x1092F5: std::__shared_ptr<blob,
(__gnu_cxx::_Lock_policy)2>::__shared_ptr<std::allocator<blob>>(std::_Sp_alloc_shared_tag<std::allocator<blob>
>) (shared_ptr_base.h:1342)
==13174==    by 0x109185: shared_ptr<std::allocator<blob> > (shared_ptr.h:359)
==13174==    by 0x109185: allocate_shared<blob, std::allocator<blob> >
(shared_ptr.h:706)
==13174==    by 0x109185: make_shared<blob> (shared_ptr.h:722)
==13174==    by 0x109185: main (issue.cc:20)
==13174== 

I've confirmed that this leak exist using GNU libc's mtrace(), i.e., this is
not a valgrind bug.

Note that changing -O into -O0 or -O2 removes the leak.  

This is a reduced test case from a larger project that started leaking memory
after I upgraded Debian unstable's g++-8 package from version 8.2.0-13 to
version 8.2.0-16.  I also have some tests that started raising bad_weak_ptr
exceptions, but so far I haven't reduced those.

Note that 8.2.0-16 includes the patch for libstdc++/88782 ; could this be
related?

Reply via email to