C++ 子分配内存块

C++ 子分配内存块,c++,memory-management,C++,Memory Management,我正在使用一个网络API,它将1条或多条消息的列表返回到我提供的缓冲区中。典型的缓冲区在返回时如下所示: | B |消息1 | S |消息2 | S |消息3 | E | 其中| B |是表示开始的字符,| S |是分隔符,| E |是结束符。消息的长度和数量可以不同。我想做的是遍历这个缓冲区一次,并将其拆分为(在本例中)3个组件消息,然后向处理每个消息的代码发送类似于std::unique_ptr的内容,并让unique_ptr负责释放内存。但是我不想把这些消息从缓冲区复制到更小的缓冲区中 是

我正在使用一个网络API,它将1条或多条消息的列表返回到我提供的缓冲区中。典型的缓冲区在返回时如下所示:

| B |消息1 | S |消息2 | S |消息3 | E |

其中| B |是表示开始的字符,| S |是分隔符,| E |是结束符。消息的长度和数量可以不同。我想做的是遍历这个缓冲区一次,并将其拆分为(在本例中)3个组件消息,然后向处理每个消息的代码发送类似于
std::unique_ptr
的内容,并让unique_ptr负责释放内存。但是我不想把这些消息从缓冲区复制到更小的缓冲区中


是否有一种技术可以有效地将缓冲区分配到新的、更小的堆块中,并且仍然可以获得自动清理的好处?

至少在大多数分配机制(即堆)的实现中,没有“子分配”缓冲区这回事

作为一个简单的解决方案,我建议您使用指向整个缓冲区的共享指针,加上指针(或偏移量)和找到的消息的大小

就是像这样

struct MsgPtr
{
    shared_ptr<Buffer> m_Buf;
    char* m_pMsg;
    size_t m_nMsgSize;
};
struct MsgPtr
{
共享的_ptrm_Buf;
char*m_pMsg;
尺寸(m)nMsgSize ;;
};

如果您不打算将解析后的消息长时间保存在内存中,这应该是可以的。

至少在大多数分配机制(即堆)的实现中,没有“子分配”缓冲区这样的事情

作为一个简单的解决方案,我建议您使用指向整个缓冲区的共享指针,加上指针(或偏移量)和找到的消息的大小

就是像这样

struct MsgPtr
{
    shared_ptr<Buffer> m_Buf;
    char* m_pMsg;
    size_t m_nMsgSize;
};
struct MsgPtr
{
共享的_ptrm_Buf;
char*m_pMsg;
尺寸(m)nMsgSize ;;
};

如果您不想将解析的消息在内存中保留很长时间,这应该是可以的。

查找新位置。查找新位置。这是一个好主意。更进一步,我想知道shared_ptr的构造函数形式(8)是否可以满足我的需要。这是个好主意。更进一步,我想知道shared_ptr的构造函数形式(8)是否可以满足我的需要。