peakzhang 发表于 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 没有这个重载
对于这样的情况大家是怎么处理的?

peakzhang 发表于 2007-12-31 22:28:31

不要调用clone,你用ACE_Message_Block的copy功能,直接从cdr中复制到新的ACE_Message_Block中即可。我就是这么处理的。

peakzhang 发表于 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个字节没释放

peakzhang 发表于 2007-12-31 22:28:57

我在handle_write_stream 中直接result.message_block().release();

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

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

在handle_write_stream 中直接释放就可以了

peakzhang 发表于 2007-12-31 22:29:13

Proactor框架本身没泄漏啊,是你使用的问题。你按我说的办法做,就没有泄漏了。

peakzhang 发表于 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;

fly2008 发表于 2008-1-4 15:08:48

有人看过ace_sstring 类了没,它在构造函数中分配的资源在那里释放的阿
页: [1]
查看完整版本: 还是关于内存泄露 来看看