2012-04-18 2 views
1

를 자유롭게 :제대로 나는 다음과 같은 방법으로 구글 프로토콜 버퍼를 사용하고 프로토콜 버퍼 메모리

void myfunc() { 
    Buffers::MyBuffer buf; 
    buf.ParseFromArray(data, datalen); 
    ... 
    return; 
} 

documentation for Protocol Buffers says 그 개체가 삭제되어야 버퍼 메모리를합니다. 나는 C++ 천재는 아니지만 deletenew으로 할당 된 객체에만 호출해야한다고 생각했습니다. 여기서 메모리가 정리 되었습니까?

답변

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 은 삭제에서 버퍼를 유지 정적 새로운 방법을 사용하려면

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

내가 돈 ': 당신이 어떤 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 } 

을 알았어. "mutable_someinternalbuffer"는 무엇을 의미합니까? –

+0

@AlexanderGuo 이것은'someinternalbuffer'라는 필드에 대해 protobuf 컴파일러에 의해 생성 된 메소드입니다. 필드 유형에 대한 포인터를 리턴합니다. – Arpegius

관련 문제