2016-06-28 13 views
1

今、私はのprotobufメッセージを持っています。 whileループの中で、メッセージを作成してQListに追加します。私はDebugStringメソッドを使用して印刷しようとし、whileループではエラーなしで正常に動作します。 whileループの外側で全く同じ->DebugString()メソッドを呼び出そうとすると、次のようになります。純粋仮想メソッド呼び出しエラーGoogleプロトコルバッファ

アボート(コアダンプ)。

アクティブ 例外

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

ダングリングポインタをリストに追加しています。 – tkausl

答えて

5

nextMsgは、whileループ内のローカル変数であるなしで呼び出さ終了と呼ばれる純粋仮想メソッドは、それがループから抜け出すときに破壊され、その後で保存先住所allMessagesがぶら下がってしまいます。それについてのどんな逆参照も単なるUBです。

ループ外のポインタを使用する場合は、ループ内でnew(最後にdelete)のポインタを使用するか、smart pointersを使用して手動メモリ管理を避ける必要があります。

+1

...メッセージのライフタイムを管理するためにアリーナを使用してください... –

+0

新しいものと削除する方法の例を教えてください。 – Mike

+0

@Mikeなどwhile(){msgs :: sensor :: Plot * nextMsg =新しいmsgs :: sensor :: Plot; .... allMessages.append(nextMsg); ...} 'と' while(){delete allMessages.at(i); } ' – songyuanyao

関連する問題