혹시나 싶어서 두번째 샘플처럼 데이터 블럭을
넘겨봤는데 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();
}
{
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()) );