正确释放协议缓冲区内存

Properly freeing Protocol Buffer memory

本文关键字:缓冲区 内存 协议 释放      更新时间:2023-10-16

我通过以下方式使用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
}