首页 > 解决方案 > 从方法返回指向 flatbuffer 的指针

问题描述

我有一个这样的类,即使构建器是在堆栈上创建的,返回 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 将处于无效状态,必须清除它才能再次使用。然而,这也意味着你能够销毁构建器,同时将缓冲区保留在应用程序中。”

看起来这应该可以工作,即使构建器被破坏,返回的指针也将指向有效的缓冲区。有人可以确认这一点,看起来缓冲区本身是在堆上创建的。

标签: c++c++11flatbuffers

解决方案


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

就像您引用的文档说的那样,您必须ReleaseBufferPointer改用。或者制作一个副本,尽管这显然效率较低。

更好地构建您的代码,以便调用者拥有FlatBufferBuilder并将其作为参数传递。


推荐阅读