2011-04-10 5 views
2

가상 함수에 액세스하려고 할 때마다 분할 오류가 발생합니다. 코드는 기본적으로 다음과 같습니다.가상 함수가 세그먼트 화 오류를 호출합니다.

class Super { 
    public: 
    Super() { cout << "Ctor Super" << endl; } 
    virtual void test() = 0; 
    }; 

class Sub : public Super { 
    public: 
    Sub() { cout << "Ctor Sub" << endl; } 
    void test() { cout << "Test in Sub" << endl; } 
    }; 

void main() 
{ 
    Super* s = new Sub; 
    s->test(); // Segmentation fault So I tried the one below 

    Sub* s1 = new Sub; 
    s1->test(); //Still segmentation fault 

    Sub s2; 
    s2.test(); // Works fine BUT 

    Super *s3 = &s2; 
    s3->test(); // segmentation fault and EVEN 

    Sub *s4 = &s2; 
    s4->test(); //segmentation fault 
} 

가상 기능에 대해 알고있는 거의 모든 것을 시도했지만 작동하지 않습니다. 실제로 더 큰 프로그램의 일부이므로 거기에 문제가있을 수 있지만 가상 기능을 제거하거나 가상 기능을 중지하자 마자 작동합니다. 어떤 아이디어?

vtable을 검사 할 수있는 도구 나 방법이 있습니까?

+0

코드가 잘 작성되어 실행됩니다. –

+0

yups해야하지만 내 컴퓨터에 없습니다. 나는 LYnxOS powerPC 기계에서 실행 중이다. 실행해서는 안되는 상황을 생각해 볼 수 있습니까? –

답변

0

클래스 서브 클래스는 슈퍼 클래스로부터 상속되지 않으므로 현재 작성된 어떤 식 으로든 관련되지 않습니다.

0

이 코드를 컴파일 할 수 있습니까?

  • 모든 방법은 비공개입니다.
  • Sub와 Super간에 상속이 없습니다.
  • 생성자의 이름이 잘못 지정되었습니다.
  • main() 함수는 int를 반환하지 않습니다.

이러한 모든 결과는 segfault없이 컴파일되고 실행됩니다.

+0

예이 코드는 컴파일 및 실행됩니다. 그래서 seg 오류가 발생합니다. 그것의 C + + 코드, 나는 당신이 다른 언어 (아마도 자바 ....)와 혼동하고 있다고 생각합니다. 어쨌든 도움이된다면 ... 도움이됩니다. –

+0

코드는 내가 (그리고 조)가 대답 할 때 지금 보이는 것처럼 보이지 않았다. 처음 세 점은 수정되었습니다. 그것은 main()이 int (http://stackoverflow.com/questions/204476/what-should-main-return-in-c-c)를 리턴해야하기 때문에 여전히 C++이 아니지만, 그 것은 segfault를 정당화하지 않을 것입니다. – adl

0

컴파일러 버그 이외의 다른 문제가 발생할 수 있습니다. 정확한 컴파일러 버전을 제공 할 수 있습니까? 한편

, 나는 다음을 시도합니다 :

  • 는 클래스에 더미 int 멤버를 추가합니다. 크기가 0 인 클래스가 잘못된 코드 생성을 유발할 수 있습니다.
  • Sub::test()도 가상으로 선언하십시오. 여기에서도 컴파일러가 잘못되었을 수 있습니다.

또한 어떤 유형의 오류가 발생합니까? 정확히 SIGSEGV일까요 아니면 다른 신호입니까? 디버거 백 트레이스와 로컬 어셈블리 덤프를 제공 할 수 있습니까?

관련 문제