我正在查看一些代码(实际上是 ArduPilot),将其用作我自己的东西的灵感。现在我想我发现了一个主要错误 - 但在大声喊叫之前;)也许有人可以帮助我检查我是否误解了 C++。
有一种方法(我已经简化了):
void GCS_MAVLINK::update(void) {
// receive new packets
mavlink_message_t msg;
mavlink_status_t status;
// process received bytes
while (data_available()) {
uint8_t c = receive_data();
// Try to get a new message
if (parse_and_accumulate(c, &msg, &status)) {
handleMessage(&msg);
}
}
}
这是定期调用的。它从缓冲区读取数据直到用完,将其连同对最终消息的引用和状态结构一起扔到外部解析函数中,以通过副作用进行更新,并且每次解析器看到消息完成时,都会消耗该消息。
到目前为止,一切都很好。如果缓冲区在消息中间空了会发生什么?好的,其余的可能会在下一次计划调用时到达缓冲区。但是分配的本地/堆栈会发生什么!!!味精和状态变量?据我所知,与此同时,它们可能已被堆栈使用中的各种垃圾覆盖。堆栈指针甚至可能已经移动。
在我自欺欺人之前,有人可以帮我确认这里似乎有一个大问题..
此外,如果我通过将 msg 和 status 变量设为静态来“修复”它,它们对于包含该方法的类的每个实例仍然是分开的,对吧?
问候索伦