ACE_InputCDR 메모리 관리에 대해

30 views
Skip to first unread message

레이옷

unread,
Mar 30, 2006, 4:39:27 AM3/30/06
to kaug
이미 존재하는 메시지 블럭에 대해서 ACE_InputCDR 을
이용해서 데이터를 읽어내려고 합니다. 문제는
아래의 첫번째 샘플처럼 단지 메시지 블럭을 넘길
경우 내부적으로 copy() 가 발생한다는 것입니다.

혹시나 싶어서 두번째 샘플처럼 데이터 블럭을
넘겨봤는데 DONT_DELETE 가 없으면 access violation 이
발생하더군요. 그렇다고 플래그를 지정해도 웬지
쓰레기값이 읽히더군요.

데이터 복사를 줄이려면 어떻게 잘 넘겨야 할까요?

std::string msg1("Hello World!");
std::string msg2("Hello ACE!");
std::string msg3("hello World!");

{
ACE_Message_Block * mb = new ACE_Message_Block(128);
ACE_OS::sprintf( mb->wr_ptr(), msg1.c_str() );
mb->wr_ptr(msg1.size());

ACE_InputCDR in(mb);

// InputCDR 로 넘긴 다음 수정한다.
mb->reset();
ACE_OS::sprintf( mb->wr_ptr(), msg2.c_str() );
mb->wr_ptr(msg2.size());

char buffer[128];
in.read_char_array(buffer,msg1.size());
buffer[msg1.size()] = 0;

CHECK( msg1 == buffer );

mb->release();
}

{
ACE_Message_Block * mb = new ACE_Message_Block(128);
ACE_OS::sprintf( mb->wr_ptr(), msg1.c_str() );
mb->wr_ptr(msg1.size());

ACE_InputCDR in(mb->data_block(),ACE_Message_Block::DONT_DELETE);

// InputCDR 로 넘긴 다음 수정한다.
mb->rd_ptr()[0] = 'h';

char buffer[128];
in.read_char_array(buffer,msg1.size());
buffer[msg1.size()] = 0;

CHECK( msg3 == buffer );

mb->release();
}

레이옷

unread,
Mar 30, 2006, 9:15:29 PM3/30/06
to kaug
찾아보니 생성자가 하나 더 있더군요. 다음과 같이
해결했습니다. 메시지 블럭을 넘겨주되, 삭제해서는
안되고, rd_ptr 과 wr_ptr 을 수동으로 설정해줘야 한다는
것입니다.

{
ACE_Message_Block * mb = new ACE_Message_Block(128);
ACE_OS::sprintf( mb->wr_ptr(), msg1.c_str() );
mb->wr_ptr(msg1.size());

ACE_InputCDR in(mb->data_block(),
ACE_Message_Block::DONT_DELETE,
(size_t)(mb->rd_ptr()-mb->base()),
(size_t)(mb->wr_ptr()-mb->base()) );

redpixel

unread,
Mar 30, 2006, 10:14:36 PM3/30/06
to kaug...@googlegroups.com
핫.. 답장을 쓸려고 하니 바로 자답을 하시는군요. ^_^

--
Kwon Tai-in
http://www.redwiki.net
PGPkey: https://keyserver2.pgp.com/vkd/DownloadKey.event?keyid=0xAFA5E4510E5B4EF9
Reply all
Reply to author
Forward
0 new messages