In the following code, the lifetime of the temporary
bound to the static const reference in g() is wrong.
In fact, the destructor is called every time the function
is left (although the constructor is called only the 
first time the function is entered, which is correct).
According to the C++ standard, the lifetime of a temporary
bound to a reference should be identical to that of the
reference -- in this case, the destructor should not
be called until final clean-up.

The compiler was invoked without any options.  Running
the generated a.out reveals multiple calls to the destructor.

----- code -----

#include <iostream>
#include <ostream>

class C
{
public:
    C( char id ) ;
    C( C const& other ) ;
    ~C() ;
private:
    char                myId ;
} ;


void
g()
{
    static C const&     c = C( 'g' ) ;
    std::cerr << "in g" << std::endl ;
}

int
main()
{
    g() ;
    g() ;
    return 0 ;
}

C::C( char id )
    :   myId( id )
{
    std::cout << "ctor: " << myId << " (@" << this << ")" << std::endl ;
}

C::C( C const& other )
    :   myId( other.myId )
{
    std::cout << "copy: " << myId << " (@" << this << ")" << std::endl ;
}

C::~C()
{
    std::cout << "dtor: " << myId << " (@" << this << ")" << std::endl ;
}


-- 
           Summary: Wrong lifetime of temporary, calls destructor twice
           Product: gcc
           Version: 4.1.0
            Status: UNCONFIRMED
          Severity: critical
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: jkanze at cheuvreux dot com
 GCC build triplet: sparc-sun-solaris2.8, i686-pc-linux-gnu
  GCC host triplet: sparc-sun-solaris2.8, i686-pc-linux-gnu
GCC target triplet: sparc-sun-solaris2.8, i686-pc-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27216

Reply via email to