OMNet++ | Simulation Runtime error : Object is currently in (omnetpp::cEventHeap)simulation.scheduled-events
OMNet++ | Simulation Runtime error : Object is currently in (omnetpp::cEventHeap)simulation.scheduled-events
我在使用 OMNeT++ 方面还很陌生 IDE,我想使用一些“无限数组”在我的消息中存储一些数据。我的代码没有任何错误,但是当我启动我的模拟时,它会立即停止。我已经在调试 mod 中进行了检查,它确实启动了,但是当我应该使用此消息时,我收到了以下运行时错误:
A runtime error occured: Object is currently in (omnetpp::cEventHeap)simulation.scheduled-events, it cannot be deleted. If this error occurs inside omnetpp::cEventHeap, it needs to be changed to call drop() before it can delete that object. If this error occurs inside omnetpp::cEventHeap's destructor and is a class member, omnetpp::cEventHeap needs to call drop() in the destructor -- in module ...
这个错误看起来只有在我只是在另一个 module 中发送消息时才会出现。
经过进一步检查,我发现这是因为我使用的是“无限数组”:
我的消息实现.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
}
这是我从调试器得到的:
debugger report
从所有这些来看,我想我应该在我的消息的析构函数方法中使用 drop() 函数,但我不确定而且我还没有实现在这些无限数组中成功使用它。
这是我的 消息 析构函数 方法 :
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:我在 Win-64 OS 和 Intel-I7 上使用实际最新版本的 OMNET++。 (2020 年 7 月 30 日)
这与 'infinite' 数组或其他任何东西无关。错误消息的原因是您正试图删除一个已经安排在消息队列中的数据包。这意味着您创建了一个数据包 (Masg_event_data) 并在通过 send()
调用将其发送出去后,您保留了它的指针,然后在代码中的其他地方重新使用了该指针并尝试将其删除。在将 message/packet 传递给 send()
或 scheduleAt()
之后,您应该忘记所有指向它的指针并且永远不应该取消引用它。下次当消息被处理到目标模块的 handleMessage()
函数时,您可以使用此数据包。届时它会从事件队列中删除,您可以随意删除它。
根据调试器 stack-trace,此错误发生在 TDMA::sendMessageBurst()
函数中。您正在删除名为 sendMessageBurst
的函数中的数据包?这在语义上肯定是不正确的,但是如果没有看到和理解上面的函数体,就不可能告诉 how/why... 所以,至少,TDMA::sendMessageBurst()
和 TDMA::initialize()()
代码应该被包含在这个问题中。
我在使用 OMNeT++ 方面还很陌生 IDE,我想使用一些“无限数组”在我的消息中存储一些数据。我的代码没有任何错误,但是当我启动我的模拟时,它会立即停止。我已经在调试 mod 中进行了检查,它确实启动了,但是当我应该使用此消息时,我收到了以下运行时错误:
A runtime error occured: Object is currently in (omnetpp::cEventHeap)simulation.scheduled-events, it cannot be deleted. If this error occurs inside omnetpp::cEventHeap, it needs to be changed to call drop() before it can delete that object. If this error occurs inside omnetpp::cEventHeap's destructor and is a class member, omnetpp::cEventHeap needs to call drop() in the destructor -- in module ...
这个错误看起来只有在我只是在另一个 module 中发送消息时才会出现。
经过进一步检查,我发现这是因为我使用的是“无限数组”:
我的消息实现.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
}
这是我从调试器得到的: debugger report
从所有这些来看,我想我应该在我的消息的析构函数方法中使用 drop() 函数,但我不确定而且我还没有实现在这些无限数组中成功使用它。
这是我的 消息 析构函数 方法 :
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:我在 Win-64 OS 和 Intel-I7 上使用实际最新版本的 OMNET++。 (2020 年 7 月 30 日)
这与 'infinite' 数组或其他任何东西无关。错误消息的原因是您正试图删除一个已经安排在消息队列中的数据包。这意味着您创建了一个数据包 (Masg_event_data) 并在通过 send()
调用将其发送出去后,您保留了它的指针,然后在代码中的其他地方重新使用了该指针并尝试将其删除。在将 message/packet 传递给 send()
或 scheduleAt()
之后,您应该忘记所有指向它的指针并且永远不应该取消引用它。下次当消息被处理到目标模块的 handleMessage()
函数时,您可以使用此数据包。届时它会从事件队列中删除,您可以随意删除它。
根据调试器 stack-trace,此错误发生在 TDMA::sendMessageBurst()
函数中。您正在删除名为 sendMessageBurst
的函数中的数据包?这在语义上肯定是不正确的,但是如果没有看到和理解上面的函数体,就不可能告诉 how/why... 所以,至少,TDMA::sendMessageBurst()
和 TDMA::initialize()()
代码应该被包含在这个问题中。