2016-06-28 83 views
0

我正在使用網絡API,它將1個或多個消息的列表返回到我提供的緩衝區中。一個典型的緩衝看起來像這樣在返回:重分配內存塊

|B|message 1|S|message 2|S|message 3|E|

凡| B |是表示開始的字符,| S |是分隔符,而| E |結束了。消息可以具有不同的長度和數量。我想要做的就是遍歷這個緩衝區一次,並將其分解成(在本例中)3個組件消息,併發送類似std::unique_ptr<char*>的代碼,以處理每個單獨的消息,並讓unique_ptr負責釋放記憶。但我想這樣做,而不是將這些消息從緩衝區中複製到較小的消息中。

是否有一種技術可以有效地將緩衝區分配到新的較小的堆塊中,並且仍然可以獲得自動清理的好處?

+1

查找展示位置新。 –

回答

3

至少對於分配機制(即堆)的大多數實現,沒有「分配」緩衝區這樣的事情。

作爲一個簡單的解決方案,我建議你使用共享指向整個緩衝區的指針,加上找到的消息的指針(或偏移量)和大小。

就是這樣。

struct MsgPtr 
{ 
    shared_ptr<Buffer> m_Buf; 
    char* m_pMsg; 
    size_t m_nMsgSize; 
}; 

如果您不打算長時間將解析的消息保存在內存中,這應該沒問題。

+0

這是一個好主意。更進一步,我想知道shared_ptr的構造函數形式(8)可能只是我所需要的。 http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr –