ACE_Message_Block功能简介
ACE_Message_Block在Ace中用來表示消息的存放空間,可用做網絡通信中的消息緩沖區,使用非常頻繁,下面將在如下方簡單的介紹一下ACE_Message_Block相關功能。
1。創建消息塊
創建消息塊的方式比較靈活,常用的有以下幾種方式 :
1。直接給消息塊分配內存空間創建。
????ACE_Message_Block *mb = new ACE_Message_Block (30);
2。共享底層數據塊創建。
????char buffer[100];
????ACE_Message_Block *mb = new ACE_Message_Block (buffer,30);
這種方式共享底層的數據塊,被創建的消息塊并不拷貝該數據,也不假定自己擁有它的所有權。在消息塊mb被銷毀時,相關聯的數據緩沖區data將不會被銷毀。這是有意義的:消息塊沒有拷貝數據,因此內存也不是它分配的,這樣它也不應該負責銷毀它。
3。通過duplicate()函數從已有的消息塊中創建副本。
????ACE_Message_Block *mb = new ACE_Message_Block (30);
????ACE_Message_Block *mb2 = mb->duplicate();
這種方式下,mb2和mb共享同一數據空間,使用的是ACE_Message_Block的引用計數機制。它返回指向要被復制的消息塊的指針,并在內部增加內部引用計數。
4。通過clone()函數從已有的消息塊中復制。
????ACE_Message_Block *mb = new ACE_Message_Block (30);
????ACE_Message_Block *mb2 = mb->clone();
clone()方法實際地創建整個消息塊的新副本,包括它的數據塊和附加部分;也就是說,這是一次"深拷貝"。
2。釋放消息塊
一旦使用完消息塊,程序員可以調用它的release()方法來釋放它。
無論消息塊是哪種方式創建的,只要在使用完后及時調用release()函數,就能確保相應的內存能正確的釋放。
3。從消息塊中讀寫數據
ACE_Message_Block提供了兩個指針函數以供程序員進行讀寫操作,rd_ptr()指向可讀的數據塊地址,wr_ptr()指向可寫的數據塊地址,默認情況下都執行數據塊的首地址。下面的例子簡單了演示它的使用方法。
#include "ace/Message_Queue.h"
#include "ace/OS.h"
int main(int argc, char *argv[])
{
????ACE_Message_Block *mb = new ACE_Message_Block (30);
????ACE_OS::sprintf(mb->wr_ptr(),"%s","hello");
????ACE_OS::printf("%s\n",mb->rd_ptr ());
????mb->release();
????return 0;
}
注意:這兩個指針所指向的位置并不會自動移動,在上面的例子中,函數執行完畢后,執行的位置仍然是最開始的0,而不是最新的可寫位置5,程序員需要通過wr_ptr(5)函數手動移動寫指針的位置。
4。數據的拷貝
一般的數據的拷貝可以通過函數來實現數據的拷貝,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函數進行字符串連接的時候需要注意。
5。其它常用函數
小結:
總結
以上是生活随笔為你收集整理的ACE_Message_Block功能简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET 2.0 – 善用Data
- 下一篇: 181920.net用 文字存档