我有一些代码,我揣摩,为什么我在这里得到一个分段错误:理解为什么会出现一个分段错误
我添加了一个SpeedEffect
为EffectStack
,这工作得很好。但如果我尝试删除其中一个Effects
(已经在堆栈中),我必须致电effect.removeEffect()
。这会导致分段错误。
如果我尝试调用effect.removeEffect()
从TestStack()
功能,它运作良好(并打印在控制台上的预期“删除速度效应”)
void Test::testStack() {
Story* st = new Story; //<-- only needed for initialization of an Effect
Veins::TraCIMobility* mob = new Veins::TraCIMobility; //<-- only needed for initialization of an Effect
SpeedEffect a = SpeedEffect(1.0, st, mob);
a.removeEffect(); //<-- This one works quite well
(&a)->removeEffect(); //<-- Clearly, this works too
EffectStack s;
s.addEffect(&a); //<-- Adds a Effect to the effect Stack
assert(s.getEffects().size() == 1);
s.removeEffect(&a); //<-- Try to remove effect from stack
}
的Stack
和Effect
实现如下:
class Effect {
public:
Effect(Story* story, Veins::TraCIMobility* car) :
m_story(story), m_car(car) {}
virtual void removeEffect() = 0;
private:
Story* m_story;
protected:
Veins::TraCIMobility* m_car;
};
class SpeedEffect : public Effect {
public:
SpeedEffect(double speed, Story* story, Veins::TraCIMobility* car):
Effect(story, car), m_speed(speed){}
void removeEffect() {
std::cout << "speed effect removed" << std::endl;
}
private:
double m_speed;
};
class EffectStack {
public:
void addEffect(Effect* effect) {
if(std::count(m_effects.begin(), m_effects.end(), effect) == 0) {
m_effects.push_back(effect);
}
}
void removeEffect(Effect* effect) {
if(effect == m_effects.back()) {
//effect is pointing on the same address like its doing before, but causes the seg fault
m_effects.back()->removeEffect(); //<--- Seg Fault here!!
effect->removeEffect(); //<-- if I use this, seg fault too
m_effects.pop_back();
}else {
removeFromMiddle(effect);
}
}
const std::vector<Effect*>& getEffects() {
return m_effects;
}
private:
std::vector<Effect*> m_effects;
};
我希望这段代码足够了,我已经删除了所有未被测试场景调用的函数。
是否有任何问题,因为speedEffect
a的地址在Stack
中变得无效?
也许你可以帮助我。
有关问题的新思考: 不,我已经测试了一点,这使我更糊涂了:
void dofoo(SpeedEffect* ef) {
ef->removeEffect(); //<-- breaks with a segmentation fault
}
void Test::testStack() {
Story* st = new Story;
Veins::TraCIMobility* mob = new Veins::TraCIMobility;
SpeedEffect e = SpeedEffect(3.0, st, mob);
e.removeEffect(); //<-- Works fine
(&e)->removeEffect(); //<-- Works fine also
dofoo(&a); //<-- Jumps into the dofoo() function
}
不相关,但它看起来不像'EffectStack'成堆;看起来你更像是使用它。 –
s.removeEffect(&a); // ..如果这个工作,那么它在哪里失败? – basav
也是,m_effects.back()... back()对一个空向量是未定义的行为??检查size()之前你调用back() – basav