C++ 理解为什么存在分割错误
我有一些代码,我试图弄清楚,为什么我在这里遇到分段错误: 我将C++ 理解为什么存在分割错误,c++,segmentation-fault,C++,Segmentation Fault,我有一些代码,我试图弄清楚,为什么我在这里遇到分段错误: 我将SpeedEffect添加到EffectStack,效果非常好。但是,如果我试图删除其中一个效果(已经在堆栈上),我必须调用effect.removeEffect()。这会导致分段错误 如果我尝试从TestStack()函数调用effect.removeEffect(),它运行良好(并在控制台上打印预期的“速度效果已移除”) 我希望这段代码足够了,我已经删除了测试场景中没有调用的所有函数 由于堆栈中的speedEffecta地址无效,
SpeedEffect
添加到EffectStack
,效果非常好。但是,如果我试图删除其中一个效果
(已经在堆栈上),我必须调用effect.removeEffect()
。这会导致分段错误
如果我尝试从TestStack()
函数调用effect.removeEffect()
,它运行良好(并在控制台上打印预期的“速度效果已移除”)
我希望这段代码足够了,我已经删除了测试场景中没有调用的所有函数
由于堆栈
中的speedEffect
a地址无效,是否有问题
也许你能帮我
关于这个问题的新想法: 不,我测试了更多,这让我更加困惑:
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
}
void dofoo(速度效应*ef){
ef->removeEffect();//这可能对您没有帮助,但是持久化基于堆栈的对象的地址通常不是一个好主意。在上面的代码中,这可能没问题,因为您知道EffectStack不会比您的效果更持久
如果您执行以下操作,是否仍会发生崩溃:
SpeedEffect* a = new SpeedEffect(1.0, st, mob);
(并相应地调整代码的其余部分?)这当然会泄漏内存,但它会告诉您问题是否是SpeedEffect被销毁。另一个选项是为SpeedEffect提供一个析构函数(并提供一个虚拟析构函数)并在内部设置断点,以查看编译器何时销毁“a”。这可能对您没有帮助,但持久化基于堆栈的对象的地址通常不是一个好主意。在上面的代码中,这可能没什么问题,因为您知道EffectStack不会超过您的效果
Story* st = new Story; //<-- only needed for initialization of an Effect
Veins::TraCIMobility* mob = new Veins::TraCIMobility; //<-- only needed for initialization
如果您执行以下操作,是否仍会发生崩溃:
SpeedEffect* a = new SpeedEffect(1.0, st, mob);
(并相应地调整代码的其余部分?)这当然会泄漏内存,但它会告诉您问题是否是SpeedEffect被销毁。另一个选项是为SpeedEffect提供一个析构函数(并提供一个虚拟析构函数)并在内部设置断点,以查看编译器何时正在销毁“a”。Story*st=new Story;//Story*st=new Story;//我发现了问题。
Story* st = new Story; //<-- only needed for initialization of an Effect
Veins::TraCIMobility* mob = new Veins::TraCIMobility; //<-- only needed for initialization
我使用的是omnet仿真框架,如果我实例化可跟踪性,就会发生一些意想不到的事情。。
因此,没有它,就没有错误。我发现了问题。
我使用的是omnet仿真框架,如果我实例化可跟踪性,就会发生一些意想不到的事情。。
因此,没有它,就没有错误。无关,但它看起来不像EffectStack
真的应该是一个堆栈;它看起来更像是一个集合。s.removeEffect(&a);/…如果这起作用,那么它在哪里失败了?另外,m_effects.back()…空向量上的back()是未定义的行为??在调用back()之前检查size()s.removeEffect(&a);//removeEffect();//removeEffect();
方法,如果在效果堆栈中调用它,您是对的,我必须检查向量是否为空。但这不是问题所在。我不明白,为什么我可以在将其添加到堆栈对象中之前调用效果。removeEffect
方法,但不能在堆栈对象中(如果我使用位于向量中的指针或直接传递给EffectStack的removeEffect函数的指针,则不重要)不相关,但它看起来不像EffectStack
应该是一个堆栈;它看起来更像是一个set.s.removeEffect(&a)//…如果这样做有效,那么失败在哪里?另外,空向量上的m_effects.back()…back()是未定义的行为??在回调()之前检查大小()s.removeEffect(&a);//removeEffect();//removeEffect();
方法,如果在效果堆栈中调用它,您是对的,我必须检查向量是否为空。但这不是问题所在。我不明白,为什么我可以在将其添加到堆栈对象中之前调用效果。removeEffect
方法,但不能在堆栈对象中(如果使用位于向量中的指针或直接传递给EffectStack的removeEffect函数的指针,则不重要)这似乎不是一个答案。在发布的代码中,a
持续的时间足够长,因此基于堆栈的问题不应该是问题。是的。我认为主要的问题是,为什么我可以在测试场景中对effect对象调用removeEffect
,但如果我已将对象传递到堆栈,则不能调用。这似乎不是答案。在发布的代码中,a
持续的时间足够长,因此基于堆栈的问题不应该是问题。是的。我认为主要的问题是,为什么我可以在测试场景中对效果对象调用removeEffect
,但如果我已经将对象传递到堆栈,则不能调用。是的,我不会删除它们,因为没有删除代码中的任何对象。我只尝试从“堆栈”中删除地址。我必须在开始时有这些语句,因为我无法创建一个没有故事和移动对象的效果对象。是的,我不会删除它们,因为代码中没有删除任何对象。我只会尝试从“堆栈”中删除地址.我必须在一开始就有这样的陈述,因为没有故事和移动对象,我无法创建效果对象