使用静脉和omnet ++的自定义模块

问题描述 投票:1回答:1

我已经安装了静脉4.7,我完成了教程。一切正常。现在我构建了一个更像DemoBaseApplLayer的新模块。该模块继承自BaseAppLayer。在initialize方法中,我调用dispatchMsg函数。看起来如下:

基于几个答案,我在析构函数和完成方法中引入了cancelAndDelete(msg)。我还添加了删除(msg)方法,但没有用

dispatchMsg() {

//SignedBSMMessage sgndBSMMsg(location);
char* inputData = signedBSMMessage.CreateBSMMessage(to_CharPtr(this->curPosition.x),
                                                        to_CharPtr(this->curPosition.y),
                                                        to_CharPtr(this->curSpeed.z ),
                                                        to_CharPtr(this->curDirection.z));
cout << "Start dispatchMsg" << endl;

ObuSigndBSM obuSigndBSM("BasicSafetyMessage", 01);
obuSigndBSM.setSignedBsm(inputData);
obuSigndBSM.setMsgLength(signedBSMMessage.getLength());
Coord pos;
traci->getRoadMapPos(pos);
string laneId = std::to_string(pos.z);
obuSigndBSM.setLandId(laneId.c_str());

 bsmMessage=&obuSigndBSM;
this->sendDown(bsmMessage);
//delete bsmMessage;
cout << "End dispatchMsg" << endl;
EV_DEBUG << "BSMApp::dispatchMsg end " ;
delete(bsmMessage);

}

但是,我继续得到这个例外:

Object BasicSafetyMessage目前在(omnetpp :: cEventHeap)simulation.scheduled-events中,它无法删除。

如果在omnetpp :: cEventHeap中发生此错误,则需要将其更改为调用drop()才能删除该对象。

如果在omnetpp :: cEventHeap的析构函数中发生此错误,并且Basic Safety Message是一个类成员,

omn​​etpp :: cEventHeap需要在析构函数中调用drop() - 在模块中(Veins :: BSMApp)OBUScenerio.node [0] .appl(id = 7),在t = 1s,事件#2

我错过了什么?您的回复将不胜感激。

omnet++ veins
1个回答
0
投票

调用this-> sendDown(bsmMessage)后,考虑OMNeT ++仿真内核拥有的指针。调用此方法后不要调用delete(bsmMessage) - 否则在OMNeT ++交付时您将删除该事件(想想:有关要发送的帧的所有信息)。

仅删除指向OMNeT ++给您的数据的指针(例如,作为已接收数据的事件),即处理接收帧的方法。

© www.soinside.com 2019 - 2024. All rights reserved.