寫了一段代碼是這樣的
#include "stdio.h"
#include <string>
#include <iostream>
using namespace std;
class A
{
public:
A():i(0)
{
i++;
cout << " A::A() is Exce." << endl;
}
virtual ~A()
{
i--;
cout << " A::~A() is Exce." << endl;
}
private:
int i;
};
class B : public A
{
public:
B():j(0)
{
j++;
cout << " B::B() is Exce." << endl;
}
~B()
{
j--;
cout << " B::~B() is Exce." << endl;
}
private:
int j;
};
int main(void)
{
A *b = new B();
delete b;
return 0;
}
改代碼在 WINDOWS 和 LINUX 下編譯和執(zhí)行均沒有問題,但是在用 VC2005 逐步調(diào)試的時候會有問題。 delete b; 語句執(zhí)行時,是先執(zhí)行 B 類的析構(gòu)函數(shù),然后是 A 類的析構(gòu)函數(shù)。于是我在 A 類的析構(gòu)函數(shù)中 i--; 處設(shè)置了斷點,然后再逐步執(zhí)行,該函數(shù)執(zhí)行完成后執(zhí)行光標(biāo)突然跳到了 B類的析構(gòu)函數(shù)之后,然后 VC2005 提示該處找不到可執(zhí)行的代碼。但是直接運行生成的 EXE 程序卻沒有問題。由于 b 為 A 類型 但又指向 B 的一個指針,若 A 的析構(gòu)函數(shù)不為虛函數(shù)的話那 B 的析構(gòu)函數(shù)是不會執(zhí)行的。我還沒有在 LINUX 下逐步調(diào)試改代碼,不知道上面的問題是否是由 VC 自己的問題引起的。
剛剛在 LINUX 下用 KDEVLOP 逐步調(diào)試了一下,當(dāng) A 類的析構(gòu)函數(shù)設(shè)置為虛函數(shù)的時候沒有出現(xiàn) VC 下那樣的錯誤提示,輸出也正確。只是我在 A 類的析構(gòu)函數(shù)中設(shè)置的斷點是無效的,就是說該析構(gòu)函數(shù)中語句是可以執(zhí)行的但是此處的斷點不能讓程序在此處停下來。看來可能是在此種問題上 VC 在 DEBUG時是做了一些并不是非常準(zhǔn)確的但可能是安全性方面的提示。