当构建器被销毁时,缓冲区是否有效
Is buffer valid when the builder is destroyed?
我正在使用平面缓冲区对对象进行序列化以通过网络传输,问题是在FlatBufferBuild
超出范围后缓冲区是否仍然有效,例如:
char* GetBuffer(...size_t &size) {
flatbuffers::FlatBufferBuilder fbb;
flatbuffers::Offset<MyStruct> data = CreateMyStruct(fbb, ...);
FinishMyStructBuffer(fbb, data);
size = fbb.GetSize();
return fbb.GetBufferPointer();
}
size_t size;
char* mybuf = GetBuffer(..., size);
do(mybuf, size);
我使用mybuf
内存缓冲区是否有效?谢谢。
FlatBufferBuilder
类使用自定义类作为保存数据的基础数组。该类本身称为flatbuffers::vector_downward
,文档说:
这是 std::vector 功能的最小复制,除了从高地址增长到低地址。
该类遵循 RAII 的原则,因此析构函数正在处理作业以释放分配的数据。
~vector_downward() {
clear_buffer();
clear_allocator();
}
因此,基本上,您正在访问在离开函数作用域时已取消分配的内存。
现在有很多替代方案可以解决这个问题。我将亲自避免函数中的另一个参数并创建自定义构建器。像这样:
struct MyStructBuilder {
char* GetBuffer(..., size_t &size) {
flatbuffers::Offset<MyStruct> data = CreateMyStruct(fbb, ...);
FinishMyStructBuffer(fbb, data);
size = fbb.GetSize();
return fbb.GetBufferPointer();
}
private:
flatbuffers::FlatBufferBuilder fbb;
};
MyStructBuilder builder;
size_t size;
char* mybuf = builder.GetBuffer(..., size);
do(mybuf, size);
或者你可以使用 FlatBufferBuilder::Release
,但您需要处理释放内存的事实。这取决于你。
您对mybuf
的使用是无效的,它将导致未定义的行为,因为FlatBufferBuilder
在调用其析构函数时会破坏内部缓冲区。我建议按如下方式使用DetachedBuffer
:
flatbuffers::DetachedBuffer GetBuffer(...) {
flatbuffers::FlatBufferBuilder fbb;
flatbuffers::Offset<MyStruct> data = CreateMyStruct(fbb, ...);
FinishMyStructBuffer(fbb, data);
return fbb.Release();
}
flatbuffers::DetachedBuffer mybuf = GetBuffer(...);
do(mybuf);
请注意,DetachedBuffer
将拥有基础缓冲区内存,并在调用析构函数后释放它。
相关文章:
- 是否可以从 OpenGL 缓冲区获取原始大小的像素?
- 是否可以在 OpenGL 中的同一调用中呈现两个具有不同索引起点的不同缓冲区?
- 是否可以将 std::basic_ifstream 和 std::basic_ofstream 与自定义缓冲区一起使用?
- 是否可以在C++中拼接缓冲区,零拷贝?
- std::vector::assign/std::vector::operator=(const&) 是否保证在"this"中重用缓冲区?
- 输出操纵器 std::ends 是否向输出缓冲区添加空字符?
- 当构建器被销毁时,缓冲区是否有效
- 如何检查输入缓冲区是否为空
- 如何检查 cin 缓冲区是否包含相同的值 0.5 秒 (C++)
- C++如何检查std::cin缓冲区是否为空
- (DirectX 11)单个顶点缓冲区是否可以一次绑定到多个 IA 输入槽
- 在OpenGL中为顶点、uvs和法线使用一个缓冲区是否比使用三个缓冲区性能更好
- CUDA:查明主机缓冲区是否被固定(页面锁定)
- 使用 std::vector 作为简单缓冲区是否是一种好的做法
- 如何确定缓冲区是否已释放
- 对于std::cin缓冲区是否有大小限制?
- 命名管道在c++ Linux检查缓冲区是否已满
- ReadFile缓冲区是否需要被清空?
- 是否有一种方法来检查缓冲区是否在Brotli压缩格式
- 检测声音缓冲区是否充满数据