A调用B的函数删除自己,return后因为A已经被删除,所以堆栈指针无效,请问有什么办法解决?有办法让B的函数不要返回吗?ps:A必须在B的函数中被删除

解决方案 »

  1.   

    A在那个删除函数后不做任何事就不会出错.
    或者这样,post一个message给B,这样,在a的函数退出前B的消息处理还得不到执行,不过AB必须在一个线程里
      

  2.   

    还有一个办法,让a支持引用计数,调用b的函数,b release a,
    然后函数返回,a继续做事,到完成所有操作后,a自己release,这时refcount变成0
    就会delete 自己.
      

  3.   

    class A
    {
        void Func()
        {
            DWORD dwError;
            dwError = B.Delete( this );
            if ( dwError == 成功 )
            {
                DoSomething();//只要不访问A的成员变量,不会有问题;可以访问成员函数
            }
            else if ( dwError == ( 失败 & 对象未删除 ) )
            {
                DoSomething();//可以访问成员变量;访问成员函数
            }
            else if ( dwError == ( 失败 & this对象己删除 ) )
            {
                DoSomething();//只要不访问A的成员变量,不会有问题;可以访问成员函数
            }
        }
    }
      

  4.   

    关键A是系统的,不能修改(我这里是vbscript.dll-vbs脚本引擎)。我需要在某个画面中运行脚本,打开新的画面。而每个画面对应一个脚本引擎,打开新的画面的时候,需要加载新的脚本代码,而加载完毕后,老画面打开新画面的函数还没返回。上面说的所有方法我都想到过,但都会有一些问题。我目前解决办法是创建2个引擎,打开新画面就使用非当前激活的script engine,轮换使用。如果有其他方法,我再改吧,至少目前运行良好。
      

  5.   

    &a = new class; // do nothing
      

  6.   

    ??楼上的注释能说明白点吗?new一个对象何用?a是什么?
    如果是我说的A,那这样老的A就不存在了,这样就出现了我提到的问题。
      

  7.   

    我目前方法:
    A
    B中包含 A a[2];
    如果a[0]->closeself,那我就a[1]->CreateNewA,并且设置ActiveA = a[1];
    如果a[1]->closeself,那我就a[0]->CreateNewA,并且设置ActiveA = a[0];
      

  8.   

    ahao(天·狼·星星) 
       你的方法我注意到了,也在其它情况下使用良好,不过这里A的行为不受我控制,我是包装系统dll的,返回后系统dll还会做something。另外,不没办法得到函数退出的消息,因为函数是一个vbs脚本函数,我只能知道何时将要进入函数。另外,我使用的是com对象,所以本身就是引用计数的。 88dd(巴迪)
       感谢参与。能解释为何在删除对象后,"只要不访问A的成员变量,不会有问题;可以访问成员函数"吗?
      

  9.   

    To 88dd(巴迪)
        严格说来“只要不访问A的成员变量,不会有问题;可以访问成员函数”这种说法有问题。如果A的成员函数是虚函数,那么依旧是不能访问的,反过来,如果成员变量是静态的,那么依旧可以访问。
    一个对象析构之后,其对象数据区内所有数据无效。但静态变量和成员函数的地址都不在对象数据区内。但是,如果有虚函数存在,那么对象数据区内有虚函数表。因此访问虚函数依然会失败。
      

  10.   

    JoeRen(地球发动机) 
      就是说,对象被删除以后,静态变量和成员函数还存在?那么何时删除呢?
      

  11.   

    To JoeRen(地球发动机)
        你说的很有道理,是我不仔细。To harry202(harry) 
       应用程序在创建一个对象时分配一块内存(编译器实现),以容纳这个类的成员变量(不包含静态成员变量)和虚函数表地址,而类的成员函数是所有的对象共享的,随exe或者dll装载。当释放一个对象时,会释放这块内存。所以当对象释放以后是不能访问该对象的成员变量的。