To 88dd(巴迪) 严格说来“只要不访问A的成员变量,不会有问题;可以访问成员函数”这种说法有问题。如果A的成员函数是虚函数,那么依旧是不能访问的,反过来,如果成员变量是静态的,那么依旧可以访问。 一个对象析构之后,其对象数据区内所有数据无效。但静态变量和成员函数的地址都不在对象数据区内。但是,如果有虚函数存在,那么对象数据区内有虚函数表。因此访问虚函数依然会失败。
JoeRen(地球发动机) 就是说,对象被删除以后,静态变量和成员函数还存在?那么何时删除呢?
To JoeRen(地球发动机) 你说的很有道理,是我不仔细。To harry202(harry) 应用程序在创建一个对象时分配一块内存(编译器实现),以容纳这个类的成员变量(不包含静态成员变量)和虚函数表地址,而类的成员函数是所有的对象共享的,随exe或者dll装载。当释放一个对象时,会释放这块内存。所以当对象释放以后是不能访问该对象的成员变量的。
或者这样,post一个message给B,这样,在a的函数退出前B的消息处理还得不到执行,不过AB必须在一个线程里
然后函数返回,a继续做事,到完成所有操作后,a自己release,这时refcount变成0
就会delete 自己.
{
void Func()
{
DWORD dwError;
dwError = B.Delete( this );
if ( dwError == 成功 )
{
DoSomething();//只要不访问A的成员变量,不会有问题;可以访问成员函数
}
else if ( dwError == ( 失败 & 对象未删除 ) )
{
DoSomething();//可以访问成员变量;访问成员函数
}
else if ( dwError == ( 失败 & this对象己删除 ) )
{
DoSomething();//只要不访问A的成员变量,不会有问题;可以访问成员函数
}
}
}
如果是我说的A,那这样老的A就不存在了,这样就出现了我提到的问题。
A
B中包含 A a[2];
如果a[0]->closeself,那我就a[1]->CreateNewA,并且设置ActiveA = a[1];
如果a[1]->closeself,那我就a[0]->CreateNewA,并且设置ActiveA = a[0];
你的方法我注意到了,也在其它情况下使用良好,不过这里A的行为不受我控制,我是包装系统dll的,返回后系统dll还会做something。另外,不没办法得到函数退出的消息,因为函数是一个vbs脚本函数,我只能知道何时将要进入函数。另外,我使用的是com对象,所以本身就是引用计数的。 88dd(巴迪)
感谢参与。能解释为何在删除对象后,"只要不访问A的成员变量,不会有问题;可以访问成员函数"吗?
严格说来“只要不访问A的成员变量,不会有问题;可以访问成员函数”这种说法有问题。如果A的成员函数是虚函数,那么依旧是不能访问的,反过来,如果成员变量是静态的,那么依旧可以访问。
一个对象析构之后,其对象数据区内所有数据无效。但静态变量和成员函数的地址都不在对象数据区内。但是,如果有虚函数存在,那么对象数据区内有虚函数表。因此访问虚函数依然会失败。
就是说,对象被删除以后,静态变量和成员函数还存在?那么何时删除呢?
你说的很有道理,是我不仔细。To harry202(harry)
应用程序在创建一个对象时分配一块内存(编译器实现),以容纳这个类的成员变量(不包含静态成员变量)和虚函数表地址,而类的成员函数是所有的对象共享的,随exe或者dll装载。当释放一个对象时,会释放这块内存。所以当对象释放以后是不能访问该对象的成员变量的。