2016-06-28 48 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 –