纯虚方法称为错误Google协议缓冲区

Mik*_*ike 2 c++ qt pointers runtime-error protocol-buffers

现在我有一个QListprotobuf消息.在while循环中,我创建消息并将它们添加到QList.我尝试使用DebugString方法将它们打印出来,在while循环中它可以正常工作而没有错误.当我尝试->DebugString()在while循环之外调用完全相同的方法时,我得到:

中止(核心倾倒).

名为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();
Run Code Online (Sandbox Code Playgroud)

son*_*yao 6

nextMsg是while循环中的一个局部变量,当它离开循环时它将被销毁,然后保存的地址allMessages变得悬空.任何解除引用都只是UB.

如果你想在循环之外使用指针,你需要new在循环内部(delete最后是它们),或者使用智能指针来避免手动内存管理.