这次写了调试记录看的比较清楚的代码,如下
1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 int *iaptr; 8 9 A () 10 { 11 iaptr = new int[1]; 12 *iaptr = 15; 13 } 14 virtual ~A () 15 { 16 if(iaptr == NULL) cout << "ia is null" << endl; 17 else cout << "~A " << *iaptr << endl; 18 delete iaptr; 19 // cout << "~A" << endl; 20 iaptr = NULL; 21 } 22 virtual void f() 23 { 24 cout << "A:f()" <<endl; 25 } 26 int getia() 27 { 28 if( iaptr) 29 cout << *iaptr << endl; 30 else 31 { 32 cout << "ia ptr is null" << endl; 33 } 34 } 35 }; 36 37 class B : public A 38 { 39 public : 40 int *ibptr; 41 42 B() 43 { 44 ibptr = new int[1]; 45 *ibptr = 31; 46 } 47 virtual ~B() 48 { 49 if(ibptr == NULL) cout << "ib is null" << endl; 50 else cout << "~B " << *ibptr << endl; 51 delete ibptr; 52 // cout << "~B" << endl; 53 ibptr = NULL; 54 } 55 virtual void f() 56 { 57 cout << "B:f()" << endl; 58 } 59 int getib() 60 { 61 if( ibptr) 62 cout << *ibptr << endl; 63 else 64 { 65 cout << "ib ptr is null" << endl; 66 } 67 } 68 }; 69 70 typedef void (*F)(); 71 72 int main() 73 { 74 75 F pf = NULL; 76 B *b = new B(); 77 int **p = (int **)b; 78 79 int flag = 0 ; 80 pf = (F)p[0][flag]; 81 pf(); 82 83 84 cout << "END"<<p[0][3] << endl; 85 b->getia(); 86 b->getib(); 87 88 89 cout << sizeof(A) << endl; 90 cout << sizeof(B) << endl; 91 printf("---\n"); 92 delete b; 93 printf("---\n"); 94 b = NULL; 95 delete b; 96 printf("---\n"); 97 }
输出如下
flag=0
~B 31 ~A 15 END0 ia ptr is null ib ptr is null 8 12 --- ia is null --- ---
flag=1
~B 31 ~A 15 END0 ia ptr is null ib ptr is null 8 12 --- ia is null --- --- [段错误]
flag=2
B:f() END0 15 31 8 12 --- ~B 31 ~A 15 --- ---
分析:
从flag=0的输出,不用多分析,第一个虚析构函数执行后,delete b这句真的只执行A的析构函数。其它的与之前猜测相符。看来准备看权威书籍如何解释了。
浙公网安备 33010602011771号