从方法返回指向平面缓冲区的指针



我有一个这样的类,即使生成器是在堆栈上创建的,返回平面缓冲区指针是否有效

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

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

"调用代码可能拥有fbb的缓冲区所有权。释放缓冲指针((。如果执行此操作,FlatBufferBuilder将处于无效状态,必须先清除该状态,然后才能再次使用。然而,这也意味着您可以销毁构建器,同时在应用程序中保留缓冲区">

看起来这应该有效,并且返回的指针将指向有效的缓冲区,即使构建器被破坏。有人能证实这一点吗,看起来缓冲区本身就是在堆上创建的。

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

正如您引用的文档所说,您必须使用ReleaseBufferPointer。或者复制,尽管这显然效率较低。

更好的做法是构造代码,使调用方拥有FlatBufferBuilder并将其作为参数传递。

最新更新