找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4003|回复: 6

还是关于内存泄露 来看看

[复制链接]
发表于 2007-12-31 22:28:22 | 显示全部楼层 |阅读模式
我遇到一个问题
我要用ACE_Asynch_Write_Stream::Write发送数据, 他的参数是ACE_Message_Block&
我的数据存放在ACE_Output_CDR里, ACE_Output_CDR::begin()只能得到const ACE_Message_Block*
所以我这样写
ACE_Output_CDR cdr;
ACE_Message_Block* blk = cdr.begin()->clone();
然后发现这样cdr中的mblk无法释放 每次都有520字节不会释放
cdr.begin()->release()无法调用 应为cdr.begin()是const 没有这个重载
对于这样的情况大家是怎么处理的?
 楼主| 发表于 2007-12-31 22:28:31 | 显示全部楼层
不要调用clone,你用ACE_Message_Block的copy功能,直接从cdr中复制到新的ACE_Message_Block中即可。我就是这么处理的。
 楼主| 发表于 2007-12-31 22:28:50 | 显示全部楼层
copy的话可以解决这个问题 但有没有更好的办法

ACE_WIN32_Asynch_Read_Stream::read (ACE_Message_Block &message_block,
                                    size_t bytes_to_read,
                                    const void *act,
                                    int priority,
                                    int signal_number)
{
  size_t space = message_block.space ();
  if (bytes_to_read > space)
    bytes_to_read = space;

  if (bytes_to_read == 0)
    {
      errno = ENOSPC;
      return -1;
    }

  // Create the Asynch_Result.
  ACE_WIN32_Asynch_Read_Stream_Result *result = 0;
  ACE_NEW_RETURN (result,
                  ACE_WIN32_Asynch_Read_Stream_Result (this->handler_proxy_,
                                                       this->handle_,
                                                       message_block,
                                                       bytes_to_read,
                                                       act,
                                                       this->win32_proactor_->get_handle (),
                                                       priority,
                                                       signal_number),
                  -1);

  // Shared read
  int return_val = this->shared_read (result);

  // Upon errors
  if (return_val == -1)
    delete result;

  return return_val;
}

boundercheck提示粗体那一段没有释放是什么原因?

每次都有88个字节没释放
 楼主| 发表于 2007-12-31 22:28:57 | 显示全部楼层
我在handle_write_stream 中直接result.message_block().release();

ACE自带的很多Proactor的例子都是这么用的

就是在需要写的时候用write_.write(ACE_Message_Block& mb);

在handle_write_stream 中直接释放就可以了
 楼主| 发表于 2007-12-31 22:29:13 | 显示全部楼层
Proactor框架本身没泄漏啊,是你使用的问题。你按我说的办法做,就没有泄漏了。
 楼主| 发表于 2007-12-31 22:29:21 | 显示全部楼层
/// Build a CDR stream with an initial Message_Block chain, it will
  /// *not* remove <data>, since it did not allocate it.
  ACE_OutputCDR (ACE_Message_Block *data,
                 int byte_order = ACE_CDR_BYTE_ORDER,
                 size_t memcpy_tradeoff=
                 ACE_DEFAULT_CDR_MEMCPY_TRADEOFF,
                 ACE_CDR::Octet giop_major_version =
                 ACE_CDR_GIOP_MAJOR_VERSION,
                 ACE_CDR::Octet giop_minor_version =
                 ACE_CDR_GIOP_MINOR_VERSION);

建议楼主看看C++NP VOL1 P88 的例程了解ACE_OutputCDR的用法

顺便 ACE_Message_Block* blk = cdr.begin()->clone();
blk 是新创建出来的 必须要调用 blk->release() 才能释放掉
/// Return an exact "deep copy" of the message, i.e., create fresh
  /// new copies of all the Data_Blocks and continuations.
  virtual ACE_Message_Block *clone (Message_Flags mask = 0) const;
发表于 2008-1-4 15:08:48 | 显示全部楼层
有人看过ace_sstring 类了没,它在构造函数中分配的资源在那里释放的阿
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-11-25 02:07 , Processed in 0.014490 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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