kim@cs.sfu.ca (01/26/89)
In using g++ (version 1.31.0) we have encountered a serious problem in the
code generated for virtual destructors.
Criteria: The following code results in runtime infinite recursion on ~derived:
#include <stdio.h>
class base
{
base();
virtual ~base();
};
inline base::base() {}
inline base::~base() {}
class derived : base
{
derived();
~derived();
};
inline derived::derived() : () {}
inline derived::~derived() { fputc('*',stderr); }
main()
{
derived a;
}
The semantics of C++ indicates that the base class destructor is executed
after the derived class destructor code is executed. See:
Stroustrup, The C++ Programming Language, p. 290
Stroustrup, The Evolution of C++ 1985 to 1987, Proceedings of
the Usenix C++ Workshop, 1987, p. 10
The generated g++ code apparently calls the base class destructor via
the virtual table, rather than directly. This, of course, results in the
infinite recursion.schmidt@siam.ics.uci.edu (Doug Schmidt) (01/26/89)
In article <8901251939.AA08887@sfu_cmpt.cs.sfu.ca> kim@cs.sfu.ca writes: ++In using g++ (version 1.31.0) we have encountered a serious problem in the ++code generated for virtual destructors. ++ ++Criteria: The following code results in runtime infinite recursion on ~derived: ++ ++ #include <stdio.h> ++ ++ class base ++ { ++ base(); ++ virtual ~base(); ++ }; ++ ++ inline base::base() {} ++ inline base::~base() {} ++ ++ class derived : base ++ { ++ derived(); ++ ~derived(); ++ }; ++ ++ inline derived::derived() : () {} ++ inline derived::~derived() { fputc('*',stderr); } ++ ++ main() ++ { ++ derived a; ++ } ++ This bug is fixed in GNU G++ 1.32. However, your code is also incorrect, since the constructor's and destructor's are declared in the ``private'' section of class base and class derived, by the default visibility rules. Here's what a beta version of g++ 1.32.1 says: ---------------------------------------- In function struct derived *derived::derived (): virt-dest-bug.1.32.cc:9: the constructor struct base *base::base () is private virt-dest-bug.1.32.cc:18: no default constructor defined for type `base' In function int main (): virt-dest-bug.1.32.cc:18: the constructor struct derived *derived::derived () is private virt-dest-bug.1.32.cc:23: no default constructor defined for type `derived' ---------------------------------------- When I added the keyword ``public'' to the classes the program ran as expected. Doug -- schmidt@ics.uci.edu (ARPA) | Per me si va nella citta' dolente. office: (714) 856-4043 | Per me si va nell'eterno dolore. | Per me si va tra la perduta gente. | Lasciate ogni speranza o voi ch'entrate.