2016-08-01 22 views
-1

relativ neu in C++ Entwicklung im Allgemeinen und Serialisierung speziell.Wie kann man einen String Pointer korrekt de-serialisieren?

Ich habe eine Netzwerkanwendung, die eine serialisierte Nachricht mit ZeroMQ empfängt, überprüft eines der Felder und wenn es einen bestimmten Wert hat, leitet es die Nachricht mit ZeroMQ erneut an einen anderen Client weiter.

So erhält Funktion A die Nachricht und speichert sie in einen String-Zeiger:

void A() 
{ 
    std::string* serialStr = new string(static_cast<char*>(input->Data()), input->Size()); 

    if(B(serialStr) == "One") { 
    CreateMessage(const_cast<char*>(serialStr->c_str()), serialStr->length(), cleanup, serialStr)); 
    } 
} 

cleanup(void *data, void *hint) {delete (string*)hint;} 

Die Create Funktion verantwortlich ist, um tatsächlich serialStr zu löschen.

Wie kann ich die Funktion B aufrufen, ohne die serialStr-Zeichenfolge zu kopieren? So etwas wie das folgende funktioniert nicht:

std::string B(std::string* data) 
{ 
    messaging::BMessage* msg = new messaging::BMessage; 
    msg->ParseFromString(data); 

    return msg->data(); 
} 

Danke für die Hilfe!

+5

Warum verwenden Sie einen 'std :: string *' Zeiger an 1. Stelle? –

+0

Sie haben Speicherverluste in Ihrer Funktion. Und machen Sie sich keine Gedanken über das Kopieren, die meisten davon sind Züge (mit einem relativ modernen C++ - Compiler) oder werden weggelassen. –

+0

Scheint, dass Sie intern "Google Protobuf" verwenden, aber die eigentliche Frage ist nicht klar, wo ist das Problem. Denken Sie auch daran, dass "std :: string" nicht alle Male wörtlich kopiert. Siehe [** C ** opy ** O ** n ** W ** rite] (https://en.wikipedia.org/wiki/Copy-on-write) – iammilind

Antwort

-1

Was ist falsch an Referenzen? und wie es sein kann, ohne zu kopieren (und kopiert nur Adresse, wenn es eine Referenz oder ein Zeiger ist)

+0

freigibt Bitte beheben Sie das Leck. Und ParseFromString nehmen keine Referenz. – 4386427