2012-04-18 57 views

回答

1

當對象被銷燬時,緩衝區的內存應該被釋放。

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 爲了保持緩衝被刪除,使用靜態的新方法:如果你需要保留任何SomeInternalBuffer但不MyBuffer使用release_<field>方法

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 
} 

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 
} 
+0

我不沒有得到它。 「mutable_someinternalbuffer」是什麼意思? – 2015-08-30 01:44:54

+0

@AlexanderGuo這是一個由protobuf編譯器爲一個名爲'someinternalbuffer'的字段生成的方法,它返回指向字段類型的指針。 – Arpegius 2015-08-30 07:58:56