成员向量中先前存储的值在收到新的BSM之后发生更改

时间:2018-07-09 16:44:38

标签: c++ omnet++ veins

我写了一个关于静脉的车辆的申请,如下所示:

头文件:

class CarApp : public BaseWaveApplLayer
{
public:
  CarApp();
  ~ CarApp();
  void initialize(int stage);
  void finish();

protected:
  void handleSelfMsg(cMessage* msg);
  void onBSM(BasicSafetyMessage* bsm);

private:
  std::vector<Sender> senderVector_;
};

实现:

CarApp::CarApp() {}
CarApp::~CarApp() {}

void CarApp::initialize(int stage) {
  BaseWaveApplLayer::initialize(stage);
}

void CarApp::finish() {
  BaseWaveApplLayer::finish();
}

void handleSelfMsg(cMessage* msg) {
  BaseWaveApplLayer::handleSelfMsg(msg);
}

inline Sender* findSender(int senderId, std::vector<Sender>& senderVector) {
  for (auto sender : senderVector) {
    if (sender.getId() == senderId)
      return &sender;
  }
  return nullptr;
}

void onBSM(BasicSafetyMessage* bsm) {
  if (condition to check if this BSM is from a new sender) {
    auto sender = Sender(bsm->getSenderAddress(), other variable initializations);
    senderVector_.push_back(sender); // <- this is where I face the problem
  }
  else {
    // update other values in Sender object
  }
  // This part wasn't in the original MWE
  auto sender = findSender(id, senderVector_);
  // ... process members of "sender"
  delete(sender); // <-- this was the real culprit!
}

发件人类标题:

class Sender
{
  Sender();
  explicit Sender(int id, Coord pos, Coord accel);

  private:
    int id_;
    Coord pos_;
    Coord accel_;
}

发件人类实现:

Sender::Sender() {}
Sender::Sender(int id, Coord pos, Coord accel)
  : id_(id), pos_(pos), accel_(accel) {}

只要CarApp收到BSM,就会运行onBSM()函数。

当我收到第一个BSM时,将创建一个新的Sender对象,将其初始化并推送到senderVector_中。但是,当我从同一发件人或其他任何发件人接收到下一个BSM时,先前存储的Sender对象将被垃圾值破坏。

此外,当将新的CarApp对象推入Sender时,senderVector_崩溃。

我没有理由使它失败,因为按预期工作似乎很简单。有人知道为什么不是吗?

编辑1:删除了@UnholySheep和@ user6386155建议的对Coord对象的引用

编辑2:我编写了一个简单的MWE,该MWE在没有模拟器的情况下也可以工作,只是为了检查逻辑。它完美地工作。这绝对不是C ++问题,而是静脉或OMNET ++问题。

编辑3:使用实际问题更新了MWE。我后来发现了这一点,因此无法在此MWE中复制逻辑。抱歉!

1 个答案:

答案 0 :(得分:0)

在@ChristophSommer的建议上发布此答案。

发布此问题时,我不知道真正的问题,因此没有创建代表实际代码的MWE。

后来我发现我正在删除指向senderVector_中对象的指针。该指针没有分配任何内存,而只是指向正确的Sender对象。

解决方案只是从代码中删除delete(sender);行。由于此指针是在堆栈上创建的,因此一旦onBSM()完成执行,它将自动将其丢弃。