🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

2 total messages Started by Isaac Tue, 19 Sep 1989 06:30
bug with virtual destructors (1.35.0, 1.36.0-)
#435
Author: Isaac
Date: Tue, 19 Sep 1989 06:30
128 lines
3055 bytes
i think i've found a bug in the implementation of virtual destructors for
g++ 1.35.0 and 1.36.0- (late august version?). i've tested the following
code with both versions of g++, and with Oasys (basically cfront 1.2):

/* test virtual destructor bug in g++ */


#include <stdio.h>

class A
{
  private:
    int i;
  public:
    A(int);
#ifdef VDEST
    virtual ~A();
#else
    ~A();
#endif
    virtual void showval();
};

class B : public A
{
  private:
    int ii;
  public:
    B(int, int);
#ifdef VDEST
    virtual ~B();
#else
    ~B();
#endif

    void showval();
};

A::A(int pi)
{
    i = pi;
}

A::~A()
{
    printf("destructor for A\n");
    showval();
}

void A::showval()
{
    printf("A::i = %d\n",i);
}

B::B(int pi, int pii) : (pi)
{
    ii=pii;
}


B::~B()
{
    printf("destructor for B\n");
    showval();
}

void B::showval()
{
    printf("B::ii = %d\n",ii);
}

main()
{
    A *ap;

    ap = new B(10,20);

    delete ap;
}

    
    
    
----------------------

the destructors for both class A and class B call the showval() method.
ap is holding a pointer to a B. if virtual destructors are NOT used,
the output will be (in both cases):

	destructor for A
	B::ii = 20

which is correct; ap is really a B, so the showval for B should be called.

if the example is compiled with -DVDEST and uses virtual destructors,
the following is output from cfront:

	destructor for B
	B::ii = 20
	destructor for A
	B::ii = 20

it calls the B destructor, then the A destructor, and B::showval() in both
cases because ap is a B.

but, this is what we get with g++:

	destructor for B
	B::ii = 20
	destructor for A
	A::i = 10

it calls the correct destructors in the correct order, but all of a sudden
ap has become an A instead of a B, which I don't think is correct behavior,
unless this has changed in cfront 2.0.... this actually makes some logical
sense, since coming out of the destructor for B, ap is no longer a B
anymore, right?? so either g++ is extremely smart and cfront 1.2 is bugged,
or cfront 1.2 is correct and g++ is slightly bugged.... any comments??

--
* Isaac J. Salzman                                            ----     
* The RAND Corporation - Information Sciences Dept.          /o o/  /  
* 1700 Main St., PO Box 2138, Santa Monica, CA 90406-2138    | v |  |  
* AT&T      : +1 213-393-0411 x6421 or x7923 (ISL lab)      _|   |_/   
* Internet  : salzman@rand.org                             / |   |
* UUCP      : !uunet!rand.org!salzman                      | |   |     
* CompuServe: 76167,1046
bug with virtual destructors (1.35.0, 1.36.0-)
#436
Author: Michael Tiemann
Date: Tue, 19 Sep 1989 09:42
10 lines
978 bytes
    it calls the correct destructors in the correct order, but all of a sudden
    ap has become an A instead of a B, which I don't think is correct behavior,
    unless this has changed in cfront 2.0.... this actually makes some logical
    sense, since coming out of the destructor for B, ap is no longer a B
    anymore, right?? so either g++ is extremely smart and cfront 1.2 is bugged,
    or cfront 1.2 is correct and g++ is slightly bugged.... any comments??
cfront 1.2 is bugged.

Michael
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads