2016-12-06 4 views
1

Ich verwende Protobuf als ein Datenformat für die Netzwerkkommunikation.Senden von Smart Pointer an Protobaf. Speicherproblem

In meinem Datenmodell hat WrapperMessage, Wrapper, der Untermeldung RegistrationRequest und InputChecking enthält.

Irgendwo in dem Programm erstelle ich eine Art von Nachricht (RegistrationRequest/InputChecking), dann übergeben es auf Funktionsvorlagen, um es in WrapperMessage dann serialisieren und senden.

Aber etwas stimmte nicht mit meinem Zeiger? malloc/new/whatever erkennt Heap-Korruption? Ich verstehe nicht, dass, warum er nicht mes.get nehmen will() und fällt während der Laufzeit ..

Fehler: Kritischer Fehler c0000374

alle Code meines Prüfprogramm festgestellt:

#include "ProtobufDataModels.pb.h" 
#include <string> 
#include <iostream> 
#include <memory> 

template <class T> 
static void SendProto(T * message); 

template <class T> 
void SendProto(T * message) 
{ 
    WrapperMessage wm; 

    if (std::is_same<T, InputChecking>::value) 
    { 
     std::shared_ptr<InputChecking> mes(message); 

     std::string msg; 
     message->SerializeToString(&msg); 
     std::cout << msg << std::endl; // all ok 

     // set inputChecking mes. to wrapperMessage 
     wm.set_allocated_mes_inputchecking(mes.get()); // crash here 

    } 
    else if (std::is_same<T, RegistrationRequest>::value) 
    { 
    } 

} 

int main() 
{ 
    InputChecking * inputChecking = new InputChecking(); 
    inputChecking->set_login("Jack"); 

    SendProto(inputChecking); 

    std::cin.get(); 

    return 0; 
} 

Antwort

2

In dem obigen Code übertragen Sie das Eigentumsrecht von message Objekt auf beide shared_ptr und Protobuf wm Objekt. Das ist falsch. Beide löschen dieses Objekt, wenn das Ende des Bereichs erreicht ist, wobei das zweite Löschen einen Fehler verursacht. Der einfachste Weg, um es zu beheben, ist message Zeiger direkt zu verwenden, ohne shared_ptr überhaupt zu erstellen.