2016-06-28 10 views
1

Im Moment habe ich eine QList von Protobuf Nachrichten. Innerhalb einer while-Schleife erstelle ich Nachrichten und füge sie zu QList hinzu. Ich versuche, die DebugString-Methode zu verwenden, um sie auszudrucken, und in der while-Schleife funktioniert es gut ohne Fehler. Wenn ich versuche, genau die gleiche ->DebugString() Methode außerhalb der While-Schleife aufzurufen, bekomme ich:Reine virtuelle Methode namens Fehler Google Protokoll Puffer

Abbruch (Core Dumped).

rein virtuelle Methode namens ohne aktive Ausnahme genannt terminate

QList<const ::google::protobuf::Message*> allMessages; 

while() { 
    msgs::sensor::Plot nextMsg; 
    .... 
    allMessages.append(&nextMsg); 
    std::cout << allMessages.at(0)->DebugString(); 
} 
std::cout << allMessages.at(0)->DebugString(); 
+2

Sie fügen der Liste dangelnde Zeiger hinzu. – tkausl

Antwort

5

nextMsg ist eine lokale Variable innerhalb der while-Schleife, wird es, wenn aus der Schleife erhalten zerstört werden, und dann gespeicherte Adresse in allMessages wird baumeln. Jede Dereferenzierung ist nur UB.

Wenn Sie die Zeiger außerhalb der Schleife verwenden möchten, müssen Sie new sie innerhalb der Schleife (und delete sie zuletzt), oder smart pointers verwenden, um manuelle Speicherverwaltung zu vermeiden.

+1

... oder verwenden Sie eine Arena, um die Lebenszeiten der Nachrichten zu verwalten ... –

+0

Könnten Sie ein Beispiel geben, wie man sie neu erstellt und löscht? – Mike

+0

@Mike Wie 'while() {Nachrichten :: Sensor :: Plot * nextMsg = neue msgs :: sensor :: Plot; .... allMessages.append (nextMsg); ...} 'und' while() {lösche allMessages.at (i); } ' – songyuanyao

Verwandte Themen