首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以前在成员向量中存储的值在接收新的BSM后进行更改。

以前在成员向量中存储的值在接收新的BSM后进行更改。
EN

Stack Overflow用户
提问于 2018-07-09 16:44:37
回答 1查看 128关注 0票数 0

我为一辆车辆编写了如下申请:

头文件:

代码语言:javascript
复制
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_;
};

执行情况:

代码语言:javascript
复制
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!
}

发件人类标题:

代码语言:javascript
复制
class Sender
{
  Sender();
  explicit Sender(int id, Coord pos, Coord accel);

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

发送方类实现:

代码语言:javascript
复制
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对象被推入senderVector_时,senderVector_会崩溃。

我没有理由这样做失败,因为它似乎相当简单的工作,如预期。有没有人知道为什么不是呢?

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-12 19:24:10

把这个答案贴在@ChristophSommer的建议上。

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

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

解决方案只是从代码中删除delete(sender);行。因为这个指针是在堆栈上创建的,所以一旦onBSM()完成执行,它就会自动丢弃。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51250371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档