#c #flatbuffers
#c #плоские буферы
Вопрос:
Я считываю сжатые данные с диска, распаковываю их и создаю объект «Cell», который был сгенерирован из схемы плоского буфера.
Cell* getCell(int x, int y, int z) {
// ...
return GetCell(buffer); // buffer is an inflated uint_8 data array
}
Пока все хорошо. Но как я могу удалить элемент? Поскольку позже невозможно получить доступ к данным буфера.
Комментарии:
1. Недостаточно информации, чтобы дать разумный ответ. Обычно правильным местом будет
Cell
деструктор, еслиCell
он удерживается. Если нет,Cell * temp = GetCell(buffer); delete buffer; return temp;
2. Извините, но вы понятия не имеете, о чем говорите. Класс Cell — это сгенерированный код. Объект Cell создается из смещения, выровненного по порядку, в данные буфера. Тот, кто знает FlatBuffer, также будет знать, о чем я говорю… Другими словами: у меня нет реального контроля над тем, как реализуется деструктор (он генерируется), и у меня снова нет доступа к необработанному буферу. Я мог бы обернуть его в собственный объект — но опять же, я думаю, что это обычная схема использования, и FlatBuffer предлагает что-то свое для этого сценария.
Ответ №1:
Вам нужно будет удерживать буфер отдельно, чтобы иметь возможность удалить его, поскольку вы не можете получить указатель буфера из корневого указателя (в данном случае Cell *
). Как вы сами говорите, вы также не можете уничтожить a Cell *
, поскольку он не владеет этой памятью.
Редактировать: по-видимому, такая функция возможна, см.: https://github.com/google/flatbuffers/commit/6862b2ff08021c7ba474334a6e2a3f3b1fc0dee5 Это выводит указатель буфера из корневого указателя.