我写了一个关于静脉的车辆的申请,如下所示:
头文件:
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中复制逻辑。抱歉!
答案 0 :(得分:0)
在@ChristophSommer的建议上发布此答案。
发布此问题时,我不知道真正的问题,因此没有创建代表实际代码的MWE。
后来我发现我正在删除指向senderVector_
中对象的指针。该指针没有分配任何内存,而只是指向正确的Sender
对象。
解决方案只是从代码中删除delete(sender);
行。由于此指针是在堆栈上创建的,因此一旦onBSM()完成执行,它将自动将其丢弃。