找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5324|回复: 3

ACE_Message_Block的release问题

[复制链接]
发表于 2009-11-23 11:16:07 | 显示全部楼层 |阅读模式
一个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会出错。
发表于 2009-11-23 18:20:40 | 显示全部楼层
确保自己每次release后把指针置为NULL
下次release做判断,if (h_blk == 0)再release
或者用static的ACE_Message_Block::release(h_blk),它帮你在内部进行了判断。
 楼主| 发表于 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的方法。
发表于 2009-11-24 13:21:36 | 显示全部楼层
这是不可能的。就像用普通的c++类一样,没任何办法判断是否一个指针已经被delete过。
给别人用的类,告诉他用法就可以了,他不这样用出问题就自己负责。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-23 16:23 , Processed in 0.014148 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表