2016-06-28 100 views
1

現在我有一個QList protobuf消息。在while循環中,我創建消息並將它們添加到QList。我嘗試使用DebugString方法將它們打印出來,並在while循環中正常工作,沒有錯誤。當我嘗試在while循環之外調用完全相同的->DebugString()方法時,我得到:純虛擬方法稱爲錯誤谷歌協議緩衝區

中止(核心轉儲)。

稱爲純虛方法終止所謂的不存在活躍 例外

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 = new msgs :: sensor :: Plot; .... allMessages.append(nextMsg); ...}'和'while(){delete allMessages.at(i); }' – songyuanyao