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
,但如果我已经将对象传递到堆栈,则不能调用。是的,我不会删除它们,因为没有删除代码中的任何对象。我只尝试从“堆栈”中删除地址。我必须在开始时有这些语句,因为我无法创建一个没有故事和移动对象的效果对象。是的,我不会删除它们,因为代码中没有删除任何对象。我只会尝试从“堆栈”中删除地址.我必须在一开始就有这样的陈述,因为没有故事和移动对象,我无法创建效果对象