我正在使用网络API,它将一条或多条消息的列表返回到我提供的缓冲区中。典型的缓冲区在返回时看起来像这样:
|B|message 1|S|message 2|S|message 3|E|
其中| B |是一个表示开头的字符,| S |是一个分隔符,| E |结束了。消息的长度和数量可以不同。我想要做的是遍历此缓冲区一次并将其拆分为(在本例中)3个组件消息,并将类似std::unique_ptr<char*>
的内容发送到将处理每个单独消息的代码,并让unique_ptr采取照顾释放记忆。但我想这样做,不要将这些消息从缓冲区复制到较小的缓冲区中。
我是否可以使用一种技术,有效地将缓冲区子分配到新的较小的堆块中,并且仍然可以获得自动清理的好处?
答案 0 :(得分:2)
没有&#34; suballocating&#34;缓冲区,至少对于大多数分配机制的实现(即堆)。
作为一个简单的解决方案,我建议您使用指向整个缓冲区的共享指针,以及找到的消息的指针(或偏移量)和大小。
就是这样的事情。
struct MsgPtr
{
shared_ptr<Buffer> m_Buf;
char* m_pMsg;
size_t m_nMsgSize;
};
如果您不打算将已解析的消息长时间保留在内存中,这应该没问题。