In the following reverse direction from the main dump A2: ~ A2 is called twice:
#0 0x086f5371 in B1::~B1 (this=0xe6d3a030, __in_chrg=<value optimized out>) at /fullpath/b1.cpp:400 #1 0x086ffd43 in ~B2 (this=0xe6d3a030, __in_chrg=<value optimized out>) at /fullpath/b2.h:21 #2 B2::~B2 (this=0xe6d3a030, __in_chrg=<value optimized out>) at /fullpath/b2.h:21 #3 0x086ea516 in A1::~A1 (this=0xe3e93958, __in_chrg=<value optimized out>) at /fullpath/a1.cpp:716 #4 0x0889b85d in A2::~A2 (this=0xe3e93958, __in_chrg=<value optimized out>) at /fullpath/a2.cpp:216 #5 0x0889b893 in A2::~A2 (this=0xe3e93958, __in_chrg=<value optimized out>) at /fullpath/a2.cpp:216 #6 0x0862c0f1 in E::Identify (this=0xe8083e20, t=PT_UNKNOWN) at /fullpath/e.cpp:713
A2 is obtained from A1 and B2 is obtained from B1. Only B2 has a default destructor, all base class destructors are virtual.
The code looks something like this:
e.cpp:
E::E(){ //... some code ... myA1= new A2(); } void E::Identify(){ //... if(myA1){ delete myA1; //line 713 of e.cpp myA1 = NULL; } }
a2.cpp:
A2::~A2(){ //... if (sd) //sd is not null here and also not made null after deletion { delete [] sd; //when called the second time shouldn't it crash here? } //... } // line 216 of a2.cpp
a1.cpp
A1::A1(){ //... myB1 = new B2(); //... } A1::~A1(){ //... delete myB1; //line 716 of a1.cpp //... }
I cannot understand why A2 :: ~ A2 is called twice for the same object (this pointer in backtrace has the same value for 4 and 5 frames).
If I go to frame 4 and parse it, it produces a completely different result from frame 5 of the disassembled frame (about 90 lines of assembly code about 20 lines of assembly code).
source share