проверить деструктор модуля в Omnet++ с помощью Veins

У меня проект ВАНЭЦ, работаю с вен-2.0-рс2.

В классе LinearMobility.cc у меня есть этот код,

void LinearMobility::initialize(int stage)
{
  BaseMobility::initialize(stage);

  debugEV << "initializing LinearMobility stage " << stage << endl;

  if (stage == 0)
  {

    move.setSpeed(par("speed").doubleValue());
    acceleration = par("acceleration");
    angle = par("angle");
    angle = fmod(angle,360);
 }
 else if(stage == 1)
 {
    stepTarget = move.getStartPos();

    if(!world->use2D()) 
    {
        opp_warning("This mobility module does not yet support 3 dimensional movement."\
                    "Movements will probably be incorrect.");
    }
    if(!world->useTorus()) 
    {
        opp_warning("You are not using a torus (parameter \"useTorus\" in"\
                    "BaseWorldUtility module) playground but this mobility"\
                    "module uses WRAP as border policy.");
    }
  }
}

Я пытаюсь добавить событие аварии в свой сценарий, изменив класс LinearMobility.cc.

void LinearMobility::initialize(int stage)
{

  BaseMobility::initialize(stage);

  debugEV << "initializing LinearMobility stage " << stage << endl;

if (stage == 0){

    move.setSpeed(par("speed").doubleValue());
    acceleration = par("acceleration");
    angle = par("angle");
    angle = fmod(angle,360);

    accidentCount = par("accidentCount");

    WATCH(angle);

    startAccidentMsg = 0;
    stopAccidentMsg = 0;

    if (accidentCount > 0) {
                simtime_t accidentStart = par("accidentStart");
                startAccidentMsg = new cMessage("scheduledAccident");
                stopAccidentMsg = new cMessage("scheduledAccidentResolved");
                scheduleAt(simTime() + accidentStart, startAccidentMsg);
            }
}
else if(stage == 1){
    stepTarget = move.getStartPos();

    if(!world->use2D()) {
        opp_warning("This mobility module does not yet support 3 dimensional movement."\
                    "Movements will probably be incorrect.");
    }
    if(!world->useTorus()) {
        opp_warning("You are not using a torus (parameter \"useTorus\" in"\
                    "BaseWorldUtility module) playground but this mobility"\
                    "module uses WRAP as border policy.");
    }
  }
 }

void LinearMobility::handleSelfMsg(cMessage *msg)
{
   if (msg == startAccidentMsg) {
    
    simtime_t accidentDuration = par("accidentDuration");
    scheduleAt(simTime() + accidentDuration, stopAccidentMsg);
    accidentCount--;
  }
  else if (msg == stopAccidentMsg) {
    
    if (accidentCount > 0) {
        simtime_t accidentInterval = par("accidentInterval");
        scheduleAt(simTime() + accidentInterval, startAccidentMsg);
    }
 }
}

Но у меня есть эта проблема в OMNeT++:

undisposed object: (cMessage) Scenario.node[0].mobility.scheduledAccidentResolved -- проверить деструктор модуля

undisposed object: (cMessage) Scenario.node[0].mobility.scheduledAccident -- проверка деструктора модуля

undisposed object: (cMessage) Scenario.node[1].mobility.move -- проверить деструктор модуля undisposed object: (cMessage) Scenario.node[2].mobility.move -- проверить деструктор модуля undisposed object: (cMessage) Scenario. node[3].mobility.move -- проверить деструктор модуля undisposed object: (cMessage) Scenario.node[4].mobility.move -- проверить деструктор модуля

Может ли кто-нибудь помочь мне решить эту проблему?


person Nacer    schedule 31.05.2016    source источник


Ответы (1)


Эти сообщения информируют вас о том, что вы создали объект, но не удаляете его. Это касается сообщений: startAccidentMsg, stopAccidentMsg и, возможно, сообщений, связанных с переездом.
Решение: внутри метода finish() добавьте следующий код:

cancelAndDelete(startAccidentMsg);
cancelAndDelete(stopAccidentMsg);

Если метода finish() нет, просто добавьте его.

person Jerzy D.    schedule 31.05.2016
comment
Да, в моем коде есть метод finish(): ' void LinearMobility::finish() {statistics.stopTime = simTime(); статистика.recordScalars(*это); отменитьAndDelete(startAccidentMsg); отменитьAndDelete(stopAccidentMsg); // isPreInitialized = false; }' Но возникает та же проблема - person Nacer; 31.05.2016
comment
Я думаю, что в вашей модели есть еще одна ошибка. Попробуйте установить debug-on-errors=true в omnetpp.ini и запустить симуляцию в режиме отладки. - person Jerzy D.; 31.05.2016
comment
Обратите внимание на то, что в руководстве OmNET++ говорится о методе финиша: «Записать статистику. ничего не удаляйте и не отменяйте таймеры — вся очистка должна выполняться в деструкторе.' (omnetpp.org/doc/omnetpp/manual/ ). Кроме того, код должен быть защищен от нулевых указателей, а указатель должен сбрасываться после удаления связанного объекта, чтобы избежать повторного освобождения. - person Horstinator; 16.05.2018