Как правильно удалить объект плоского буфера, считанный с диска

#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 Это выводит указатель буфера из корневого указателя.