2016-06-28 12 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

Это хорошая идея. Сделав еще один шаг, я задаюсь вопросом, может ли конструктор формы (8) shared_ptr делать то, что мне нужно. http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr –

Смежные вопросы