寫了一段代碼是這樣的
#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 下編譯和執行均沒有問題,但是在用 VC2005 逐步調試的時候會有問題。 delete b; 語句執行時,是先執行 B 類的析構函數,然后是 A 類的析構函數。于是我在 A 類的析構函數中 i--; 處設置了斷點,然后再逐步執行,該函數執行完成后執行光標突然跳到了 B類的析構函數之后,然后 VC2005 提示該處找不到可執行的代碼。但是直接運行生成的 EXE 程序卻沒有問題。由于 b 為 A 類型 但又指向 B 的一個指針,若 A 的析構函數不為虛函數的話那 B 的析構函數是不會執行的。我還沒有在 LINUX 下逐步調試改代碼,不知道上面的問題是否是由 VC 自己的問題引起的。
剛剛在 LINUX 下用 KDEVLOP 逐步調試了一下,當 A 類的析構函數設置為虛函數的時候沒有出現 VC 下那樣的錯誤提示,輸出也正確。只是我在 A 類的析構函數中設置的斷點是無效的,就是說該析構函數中語句是可以執行的但是此處的斷點不能讓程序在此處停下來。看來可能是在此種問題上 VC 在 DEBUG時是做了一些并不是非常準確的但可能是安全性方面的提示。