为什么分段错误即将来临

时间:2012-02-28 15:16:41

标签: c++

#include<iostream>
using namespace std;

class A
{
public:

virtual void f() = 0;   
};

class B: public A
{
public:

void f()
{
//   f();   //segmentation Fault
cout<<"\bB's f() called"<<endl;
f();    //recursive loop
}
};

void A:: f()
{
cout<<"\nA's f() called"<<endl;
}

   int main()
   {

     A *ptr;
     B b;

     ptr = &b;
     b.f();

  return 0;
  }

Q-&GT;在这个问题..在B类f()内部,如果我们在“cout&lt;&lt;”之前调用f()声明它给出了分段错误并且在“cout&lt;&lt;”之后声明它给出了递归循环。为什么分段错误即将到来。在此先感谢:)

4 个答案:

答案 0 :(得分:5)

当您在函数结束时进行递归调用时,编译器会优化您的堆栈使用,可能会消除它。见:http://en.wikipedia.org/wiki/Tail_call。分段错误的原因是stackoverflow!

答案 1 :(得分:2)

f()之前放置cout<<会导致f()在第一个cout<<发生之前递归无限次地被称为。你的两个问题在概念上是相同的,但提供不同的输出。

答案 2 :(得分:0)

递归循环导致问题的原因。它永远不会和,并且调用堆栈将填满。

你错过了停止状态。

答案 3 :(得分:0)

由于您的无限循环,您将获得堆栈溢出。你最终还会在cout&lt;&lt;之后调用f()。 ...但它之前更快到达那里。如果编译器做了一些影响它的优化,我也不会感到惊讶。

你需要添加一些突破你的递归循环的方法。