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()方法就也會釋放此記憶體。
如果訊息塊是引用計數的,release()就會減少計數,直到到達0為止;之後訊息塊和與它相關聯的資料塊才從記憶體中被移除。
如果訊息塊是通過共享已分配的底層資料塊建立的,底層資料塊不會被釋放。
無論訊息塊是哪種方式建立的,只要在使用完後及時呼叫release()函式,就能確保相應的記憶體能正確的釋放。
3。從訊息塊中讀寫資料
ace_message_block提供了兩個指標函式以供程式設計師進行讀寫操作,rd_ptr()指向可讀的資料塊位址,wr_ptr()指向可寫的資料塊位址,預設情況下都執行資料塊的首位址。下面的例子簡單了演示它的使用方法。
#include
"ace/message_queue.h"
#include
"ace/os.h"
int main(int argc, char *argv)
注意:這兩個指標所指向的位置並不會自動移動,在上面的例子中,函式執行完畢後,執行的位置仍然是最開始的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。其它常用函式
length() 返回當前的資料長度
next() 獲取和設定下乙個ace_message_block的鏈結。(用來建立訊息佇列非常有用)
space() 獲取剩餘可用空間大小
size() 獲取和設定資料儲存空間大小。
ACE Message Block功能簡介
ace message block在ace中用來表示訊息的存放空間,可用做網路通訊中的訊息緩衝區,使用非常頻繁,下面將在如下方簡單的介紹一下ace message block相關功能。建立訊息塊 釋放訊息塊 從訊息塊中讀寫資料 資料的拷貝 其它常用函式 1。建立訊息塊 建立訊息塊的方式比較靈活,常用...
自行釋放ACE Message Block
在使用ace message block的時候可能面臨很多種選擇,將ace message block層層傳遞,那麼有時候會忽略ace message block的釋放,而ace message block一般都是new出來的這樣會導致記憶體洩露。怎麼有簡單的辦法。辦法有,但不完善。auto ptr...
requests html的js執行功能簡單使用
usr bin env python encoding utf 8 import asyncio from requests html import htmlsession import time script geturl loginjs 執行js session htmlsession r se...