以前存储的值,在成员向量中,在收到新的 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() 执行完毕,它就会被自动丢弃。
我在 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() 执行完毕,它就会被自动丢弃。