我有一个这样的类,即使生成器是在堆栈上创建的,返回平面缓冲区指针是否有效
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
并将其作为参数传递。