我正在使用一个网络API,该网络API将1个或多个消息列表返回我提供的缓冲区。返回时典型的缓冲区看起来像这样:
|B|message 1|S|message 2|S|message 3|E|
其中| b |是指示开始的角色,| s |是一个分离器,| e |是结局。消息的长度和数字可能不同。我想做的是遍历此缓冲区一次,然后将其分为(在这种情况下)3个组件消息,然后将类似std::unique_ptr<char*>
的内容发送到将处理每个单独消息的代码,并让unique_ptr负责释放记忆。但是我想这样做,而不会将这些消息从缓冲区和较小的消息中复制出来。
我可以有效地使用一种技术,将缓冲区分配到新的较小的堆块中,并且仍然可以从自动清理中受益?
至少对于大多数分配机制的实现(即堆)。
作为一个简单的解决方案,我建议您使用共享指向整个缓冲区的指针,加上指针(或偏移)和发现消息的大小。
就是这样。
struct MsgPtr
{
shared_ptr<Buffer> m_Buf;
char* m_pMsg;
size_t m_nMsgSize;
};
,如果您不打算将解析的消息保持长时间。