写了一段代码是这样的
#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时是做了一些并不是非常准确的但可能是安全性方面的提示。