[Bug libstdc++/64399] New: g++ does not diagnose when upcasting owning pointer (e.g. unique_ptr) with non-virtual destructor

mw_triad at users dot sourceforge.net gcc-bugzilla@gcc.gnu.org
Tue Dec 23 22:58:00 GMT 2014


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

            Bug ID: 64399
           Summary: g++ does not diagnose when upcasting owning pointer
                    (e.g. unique_ptr) with non-virtual destructor
           Product: gcc
           Version: 4.8.3
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mw_triad at users dot sourceforge.net

Consider the following code:

  #include <memory>

  struct X { ~X(); };
  struct Y : X { ~Y(); };

  std::unique_ptr<Y> f();
  void g()
  {
    std::unique_ptr<X> x = f();
  }

This code is almost certainly broken; ownership of the constructed Y is
transferred to an owning unique_ptr in a way that will most likely (in general;
"always" in this specific example) result in Y's destructor never being called.

It seems pretty silly that there is no diagnostic for this. There ought to be a
warning in unique_ptr's conversion operator converting from Derived to Base if
~Base is not virtual. (Arranging at the library level to trip
-Wnon-virtual-dtor seems logical.)



More information about the Gcc-bugs mailing list