本文参考http://www.cnblogs.com/TianFang/archive/2006/12/30/607960.html
1. ACE_Message_Block 的length() 返回的是写指针和读指针之间的字符数量。如
lb->wr_ptr(10);
lb->rd_ptr(20);
lb->length(); // -10
2. ACE_Message_Block 下面的用法会和数组共用同一个内存块。释放时不释放数组。
ACE_TCHAR buffer[100];
ACE_Message_Block *b2 = new ACE_Message_Block(buffer,ACE_OS::strlen(buffer));
ACE_OS::sprintf(b2->wr_ptr(),"%s","hello word");
ACE_OS::printf("%s\n",b2->rd_ptr()); --->hello word
ACE_OS::printf("%s\n",buffer); --->hello word
b2->release();
//ACE_OS::printf("%s",b2->rd_ptr()); --->has excaption
ACE_OS::printf("%s\n",buffer); --->hello word
3. ACE_Message_Block 下面的用法会共用同一个内存块。通过引用计数的方式释放数据。
ACE_Message_Block *b3 = new ACE_Message_Block(30);
ACE_Message_Block *b4 = b3->duplicate();
ACE_OS::sprintf(b3->wr_ptr(),"%s","hello word");
ACE_OS::printf("%s\n",b3->rd_ptr()); --->hello word
ACE_OS::printf("%s\n",b4->rd_ptr()); --->hello word
ACE_OS::printf("reference_count %i\n",b4->reference_count()); ---> 2
b3->release();
ACE_OS::printf("reference_count %i\n",b4->reference_count()); ---> 1
ACE_OS::printf("%s\n",b4->rd_ptr()); --->hello word
b4->release();
ACE_OS::printf("%s\n",b4->rd_ptr()); --->has excaption
4. ACE_Message_Block下面的用法会进行深拷贝。
ACE_Message_Block *b3 = new ACE_Message_Block(30);
ACE_Message_Block *b4 = b3->clone();
ACE_OS::sprintf(b3->wr_ptr(),"%s","hello word");
ACE_OS::printf("%s\n",b3->rd_ptr()); --->hello word
ACE_OS::printf("%s\n",b4->rd_ptr()); --->乱码
ACE_OS::printf("reference_count %i\n",b4->reference_count()); --->1
b3->release();
ACE_OS::printf("reference_count %i\n",b4->reference_count()); --->1
ACE_OS::printf("%s\n",b4->rd_ptr()); --->乱码
b4->release();
ACE_OS::printf("%s\n",b4->rd_ptr()); --->has excaption
5.ACE_Message_Block 中copy的用法
一般的数据的拷贝可以通过函数来实现数据的拷贝,copy()还会保证wr_ptr()的更新,使其指向缓冲区的新末尾处。
下面的例子演示了copy()函数的用法。
mb->copy("hello");
mb->copy("123",4);
注意:由于c++是以'\0'作为字符串结束标志的,对于上面的例子,底层数据块中保存的是"hello\0123\0",而用ACE_OS::printf("%s\n",mb->rd_ptr ());打印出来的结果是"hello",使用copy函数进行字符串连接的时候需要注意。
6.ACE_Message_Block 中可以将多个消息块连接起来
ACE_Message_Block *b9 = new ACE_Message_Block(30);
ACE_OS::sprintf(b9->wr_ptr(),"%s","hello");
ACE_Message_Block *b10 = new ACE_Message_Block(30);
ACE_OS::sprintf(b10->wr_ptr(),"%s","word");
b9->cont(b10);
ACE_OS::printf("b10 %s\n",b9->cont()->rd_ptr());
ACE_OS::printf("b10 %s\n",b10->rd_ptr());