admin11 发表于 2009-11-23 11:16:07

ACE_Message_Block的release问题

一个ACE_Message_Block指针,我再调用它的release方法时,如何判断它的最后一次release是否已经被调用过了?
例如:
for (ACE_Message_Block *h_blk; getq (h_blk) != -1; )
{
   this->Function(h_blk);
if (h_blk)
{
   h_blk->release();
}
}
在我调用h_blk->release();时,我希望知道h_blk得最后一次release是否已经被调用了,否则,调用release会出错。

wishel 发表于 2009-11-23 18:20:40

确保自己每次release后把指针置为NULL
下次release做判断,if (h_blk == 0)再release
或者用static的ACE_Message_Block::release(h_blk),它帮你在内部进行了判断。

admin11 发表于 2009-11-24 08:34:53

ACE_Message_Block::release(h_blk),

我的源码是在基类中供别人用的,所以我无法保证“每次release后把指针置为NULL ”。
我看了一下ACE_Message_Block::release(h_blk)的源码,
ACE_Message_Block * ACE_Message_Block::release (ACE_Message_Block *mb)
{
ACE_TRACE ("ACE_Message_Block::release");
if (mb != 0)
    return mb->release ();
else
    return 0;
}
也是根据判断mb是否为空处理的。
但是像如下调用,还是会出问题:
for (ACE_Message_Block *h_blk; getq (h_blk) != -1; )
{
   this->Function(h_blk);
if (h_blk)
{
   h_blk->release();
}
}

void Function(ACE_Message_Block *h_blk h_blk)
{
    h_blk->release();

}

真希望ACE_Message_Block能提供判断是否已经被release的方法。

wishel 发表于 2009-11-24 13:21:36

这是不可能的。就像用普通的c++类一样,没任何办法判断是否一个指针已经被delete过。
给别人用的类,告诉他用法就可以了,他不这样用出问题就自己负责。
页: [1]
查看完整版本: ACE_Message_Block的release问题