Return 从一个方法指向 flatbuffer 的指针

Return pointer to flatbuffer from a method

我有一个这样的 class,它对 return flatbuffer 指针是否有效,即使构建器是在堆栈上创建的

class Foo {
   uint8_t*  serialize() {
     flatbuffers::FlatBufferBuilder builder(1024);
     ....
     ....
     return builder.GetBufferPointer();
   }
}

来自此处的文档https://google.github.io/flatbuffers/md__cpp_usage.html

“调用代码可能会使用 fbb.ReleaseBufferPointer() 获取缓冲区的所有权。如果您这样做,FlatBufferBuilder 将处于无效状态,并且必须先清除才能再次使用。但是,这也意味着您可以销毁构建器,同时将缓冲区保留在您的应用程序中。"

看起来这应该可以工作,并且 returned 指针将指向有效的缓冲区,即使构建器已被销毁。有人可以确认这一点吗,看起来缓冲区本身是在堆上创建的。

不,这行不通,您正在使用 GetBufferPointer,它是指向 FlatBufferBuilder 拥有的内存的裸指针,它将在离开函数时被释放。

就像您引用的文档所说,您必须改用 ReleaseBufferPointer。或者复制一份,虽然那样效率明显不高

最好构造您的代码,使调用者拥有 FlatBufferBuilder 并将其作为参数传递。