我为一辆车辆编写了如下申请:
头文件:
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对象被推入senderVector_时,senderVector_会崩溃。
我没有理由这样做失败,因为它似乎相当简单的工作,如预期。有没有人知道为什么不是呢?
编辑1:删除了@UnholySheep和@ Coord 6386155建议的对Coord对象的引用
编辑2: --我编写了一个简单的MWE,它可以在没有模拟器的情况下工作,只是为了检查逻辑。它运行得完美无缺。这绝对不是一个C++问题,而是一个静脉或OMNET++问题。
编辑3:用真正的问题更新了MWE。我后来发现了这一点,因此无法在这个MWE中复制逻辑。抱歉的!
发布于 2018-07-12 19:24:10
把这个答案贴在@ChristophSommer的建议上。
当我发布这个问题时,我不知道真正的问题,因此我没有创建代表实际代码的MWE。
后来我发现我正在删除指向senderVector_中一个对象的指针。这个指针没有分配任何内存,只是指向正确的Sender对象。
解决方案只是从代码中删除delete(sender);行。因为这个指针是在堆栈上创建的,所以一旦onBSM()完成执行,它就会自动丢弃。
https://stackoverflow.com/questions/51250371
复制相似问题