正确释放协议缓冲区内存
Properly freeing Protocol Buffer memory
我通过以下方式使用Google协议缓冲区:
void myfunc() {
Buffers::MyBuffer buf;
buf.ParseFromArray(data, datalen);
...
return;
}
协议缓冲区的文档指出,要为缓冲区释放内存,应删除该对象。我不是C++天才,但我认为delete
应该只为分配new
的对象调用。返回此处时是否清理了内存?
缓冲区的内存应在对象被销毁时释放。
void myfunc() {
Buffers::MyBuffer buf; // this create your object on stack
const char* data= new char[100];
datalen= readSomeData( data, 100 ); // not best for file, socket, etc.
buf.ParseFromArray(data, datalen); // this alocate any needed object
// by calling Buffers::SomeInternalBuffer:New
// now you may delete the data varible, is not needed
delete[] data; // called new, so call delete
...
buf.Clear(); // here the read data are lost,
// but some objects may not be deleted for future use
buf.mutable_someinternalbuffer(); // call Buffers::SomeInternalBuffer:New,
// or may not if ParseFromArray already call it
...
return; // here buf is out of scope and destroyed
// any buffers that are created by New is going to be deleted
}
release_foo若要防止删除缓冲区,请使用静态新方法:
Buffers::MyBuffer* myfunc2() {
Buffers::MyBuffer* buf = Buffers::MyBuffer:New();
if( buf->ParseFromArray(data, datalen) )
return buf; // return object, no memory dealocation
delete buf; // something wrong with data, delete, destroy and dealocate
return NULL; // return null
}
如果您需要保留任何SomeInternalBuffer
但不需要MyBuffer
请使用release_<field>
方法:
Buffers::SomeInternalBuffer* myfunc3() {
Buffers::MyBuffer buf; // this create your object on stack
if( buf.ParseFromArray(data, datalen) )
return buf.release_someinternalbuffer(); // return object
// if ParseFromArray do not call New, method release_someinternalbuffer
// will call New and copy data from default value
// no memory deallocation for returned object, everything else will deallocate
return NULL; // same as in first example
}
相关文章:
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息
- 如何使用带有矢量的 winapi 读取进程内存从另一个进程读取缓冲区?
- 在共享缓冲区内存中创建 ::std::string 对象
- OpenGL 调试上下文警告 -"将使用视频内存作为缓冲区异议的来源
- 如何从内存缓冲区加载张量流图
- 将 mmap 内存用于开销非常低的循环缓冲区
- 不正确的 Vulkan 统一缓冲区内存对齐
- 无锁环形缓冲区boost示例中的内存排序
- 为异步发送缓冲区保留内存(提升 asio 套接字)
- 来自iostream或内存缓冲区的Apache Arrow表
- 如何重复使用原始输入缓冲区内存?
- 如何释放协议缓冲区内存
- 如何正确复制内存缓冲区?
- 将不相邻的内存缓冲区视为连续缓冲区的数据结构
- 我可以在没有任何锁的情况下从不同的线程读取内存缓冲区吗?
- C++ - 读取进程内存到缓冲区,写入进程内存(同一缓冲区上的新值)将缓冲区恢复为旧值
- Vulkan中动态统一缓冲区的缓冲区内存分配
- 正确释放协议缓冲区内存
- 清除stdin缓冲区(内存占用空间)
- 线程写入缓冲区内存和线程内存