ACE Message Block功能簡介

2021-06-02 00:06:10 字數 2120 閱讀 5055

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()    返回當前的資料長度

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...