今天在调试一个程序,在退出时,突然出现这样的错误:
“Runtime Error! ....R6025 ---Pure virtual functmm call ”
捉摸了一会,发生了问题所在。
我这是一个DLL,是在FreeLibrary里出的错误,而看调用栈是在一个类的析构函数里发生了些错误。
而这个类的析构函数里调用了一个全局对象,这个全局对象又转换到基类类型再调用纯虚函数(子类实现了此纯虚函数)
我觉得可能的原因是FreeLibrary了以后全局对象的信息不全了,已找不到和基类的关系,导致出错。
模型代码如下(纯手工,不一定能运行):
interface A { virtual int add(int x,int y) = 0; } class B : public A { public: virtual int add(int x,int y){return x+y;} } //获得全局对象 A* get_A(void) { static B b_; static pA_* = &b_; return pA_; } //调用类 class mycaller { public: mycaller(){} ~mycaller(){get_A()->add(1+2);} //如果FreeLibrary时,这个析构函数才被调用,则会导致R6025的错误发生 }