以前存储的值,在成员向量中,在收到新的 BSM 后发生变化

Previously stored values, in a member vector, change after receiving new BSM

我在 Veins 写了一个车辆申请如下:

header 文件:

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!
}

发件人classheader:

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

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

发件人class实施:

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

每当CarApp收到一个BSM,onBSM()函数就是运行。

当我收到第一个 BSM 时,一个新的 Sender object 被创建、初始化并推入 senderVector_。但是,当我从同一发件人或任何其他发件人收到下一个 BSM 时,之前存储的 Sender object 会被垃圾值损坏。

此外,CarApp 在将新的 Sender object 推入 senderVector_ 时崩溃。

我想不出失败的原因,因为按预期工作似乎很简单。有谁知道为什么不是吗?

编辑 1: 根据@UnholySheep 和@user6386155

的建议删除了对 Coord objects 的引用

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

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

根据@ChristophSommer 的建议发布此答案。

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

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

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