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
并将其作为参数传递。
我有一个这样的 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
并将其作为参数传递。