繁体   English   中英

OMNet++ | 模拟运行时错误:Object 当前在 (omnetpp::cEventHeap)simulation.scheduled-events

[英]OMNet++ | Simulation Runtime error : Object is currently in (omnetpp::cEventHeap)simulation.scheduled-events

我在使用 OMNeT++ IDE 方面很新,我想使用一些“无限数组”在我的消息中存储一些数据。 我的代码很好,没有任何错误,但是当我启动模拟时,它会立即停止。 我已经检查了调试模块,它确实启动了,但是当我应该使用此消息时,我收到以下运行时错误:

出现运行时错误:Object 当前在 (omnetpp::cEventHeap)simulation.scheduled-events 中,无法删除。 如果在 omnetpp::cEventHeap 中发生此错误,则需要将其更改为调用 drop() 才能删除该 object。 如果此错误发生在 omnetpp::cEventHeap 的析构函数中并且是 class 成员,则 omnetpp::cEventHeap 需要在析构函数中调用 drop() -- 在模块中...

只有当我只是在另一个模块中发送消息时,才会出现此错误。

经过进一步检查,我发现这是由于我使用的是“无限数组”:

我的消息实现.msg

packet Msg_event_data
{
    string name_event_data;
    int clock;
    int map_left_column[]; //infinite array n°1
    int map_right_column[]; //infinite array n°2
}

这是我从调试器中得到的:调试器报告

从所有这些来看,我想我应该在我的消息的析构函数方法中使用drop() function,但我不确定,我还没有成功地使用这些无限的 arrays。

这是我的消息析构方法

Msg_event_data::~Msg_event_data()
{
   delete[] this->map_left_column; //auto generated by omnet++
   delete[] this->map_right_column;//auto generated by omnet++
}

你能帮帮我吗? 我很坚持这个......

PS:我在带有 Intel-I7 的 Win-64 操作系统上使用实际最新版本的 OMNET++。 (2020 年 7 月 30 日)

这与“无限” arrays 或其他无关。 错误消息的原因是您试图删除已安排在消息队列中的数据包。 这意味着您创建了一个数据包 (Masg_event_data),并在使用send()调用将其发送出去后,您保留了它的指针,然后在代码中的其他地方重用该指针并尝试删除它。 将消息/数据包传递给send()scheduleAt()后,您应该忘记所有指向它的指针,并且永远不应该取消引用它。 下次当消息被处理到目标模块的handleMessage() function 时,您可以使用此数据包。 此时,它会从事件队列中删除,您可以随意删除它。

根据调试器堆栈跟踪,此错误发生在TDMA::sendMessageBurst() function 中。 您正在删除 function 中名为sendMessageBurst的数据包? 这在语义上肯定是不正确的,但是如果没有看到和理解上面的 function 主体,就不可能知道如何/为什么......所以,至少TDMA::sendMessageBurst()TDMA::initialize()()代码应该包含在这个问题中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM