还是关于内存泄露 来看看
我遇到一个问题我要用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 没有这个重载
对于这样的情况大家是怎么处理的? 不要调用clone,你用ACE_Message_Block的copy功能,直接从cdr中复制到新的ACE_Message_Block中即可。我就是这么处理的。 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个字节没释放 我在handle_write_stream 中直接result.message_block().release();
ACE自带的很多Proactor的例子都是这么用的
就是在需要写的时候用write_.write(ACE_Message_Block& mb);
在handle_write_stream 中直接释放就可以了 Proactor框架本身没泄漏啊,是你使用的问题。你按我说的办法做,就没有泄漏了。 /// 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; 有人看过ace_sstring 类了没,它在构造函数中分配的资源在那里释放的阿
页:
[1]