我在一个EXE里面动态(loadlibary)加载了一个DLL(将它叫做A)
我在同一个EXE里又隐式加载了一个DLL(将这个DLL叫做B),
我在A里面又隐式加载了B,这时在B里面有一个导出类定义,
class c{
private:
c* getC(){return c1;}
void setC(c* c2){m_c=c2}
static c* c2;
}
我这个时候,在A里面new了一个c类的对象,并且把它setC到了内存中。当我程序退出的时候,我要delete掉m_c,这时候发现m_c的虚表vtrfp已经非法了???请问大家这是怎么回事啊???

解决方案 »

  1.   

    补充一下,这个class c是用AFX_EXPORT_CLASS导出的,同时所有加载行为都在一个主线程中完成的。
      

  2.   

    如果大家能告诉我NEW出来的一个对象,它的虚表vtrfp的生存空间也好?我比较迷惑的是,new出来的对象应该是在整个进程空间内都有效的,为什么会把vtrfp给掉了。变成一个无效表了??我没有执行delete操作。
      

  3.   

    hjunxu(hjun) 如果你真能回答这个问题,我先给你分也可以的!不过我相信大家来这里都是学习和互相帮助的。分不分不重要,何况只要解决过的问题我都给了分的。可以看我以前的贴子嘛。很多解决不了的,我怎么给分???
      

  4.   

    我把类定义写出来,是这样的,谢谢大家的关注!希望有人能帮我:)。
    class AFX_CLASS_EXPORT CMESLoginManage  
    {
    public:
    CMESLoginManage();
    virtual ~CMESLoginManage();
    ..... static  void SetMESLogInMag(CMESLoginManage* pMesLoginMag);
    static CMESLoginManage* GetMESLogInMag();
    };
    .cpp
    CMESLoginManage* m_MesLoginMag=NULL;
    CMESLoginManage* CMESLoginManage::GetMESLogInMag()
    {
    return m_MesLoginMag;
    }void  CMESLoginManage::SetMESLogInMag(CMESLoginManage* pMesLoginMag)
    {
    m_MesLoginMag=pMesLoginMag;
    }