2011-04-10 84 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 
} 

我已經試過幾乎所有我知道的虛擬功能,這是行不通的。它實際上是一個更大的程序的一部分,所以它可能有一些問題,但只要我刪除虛擬功能或停止使其成爲虛擬功能。有任何想法嗎?

還有沒有任何工具或方法來檢查虛擬表?

+0

代碼在此處生成並運行良好。 – 2011-04-10 12:05:29

+0

yups它應該,但它不在我的機器上。我在一臺LYnxOS powerPC機器上運行它。你能想到任何不應該運行的情況嗎? – 2011-04-11 04:06:57

回答

0

類Sub不從類Super繼承,因此它們與當前寫入的方式沒有任何關係。

0

這段代碼可以編譯嗎?

  • 你所有的方法都是私人的。
  • Sub和Super之間沒有繼承關係。
  • 構造函數被錯誤地命名。
  • main()函數不返回int。

將所有這些結果修復爲編譯並運行時沒有段錯誤的代碼。

+0

是的代碼編譯和執行..這就是爲什麼我得到一個seg故障。它是一個C++代碼,我認爲你把它和其他一些語言混爲一談(java可能是....)。無論如何,如果你發現有些......歡呼聲會有所幫助。 – 2011-04-11 04:05:44

+0

當我(和喬)回答時,代碼看起來不像現在的樣子。前三點已經確定。它仍然是無效的C++,因爲main()應該返回int(http://stackoverflow.com/questions/204476/what-should-main-return-in-c-c),但是這不會證明segfault。 – adl 2011-04-11 06:15:37

0

我不明白什麼可能會導致問題,除了編譯器錯誤。你能給出確切的編譯器版本嗎?

在此期間,我會嘗試以下方法:

  • 虛擬int成員添加到類。這可能是一個零大小的類導致錯誤的代碼生成。
  • 聲明Sub::test()也是虛擬的。再次,可能是編譯器在這裏行爲不端。

另外,你會得到什麼樣的分段錯誤?難道是SIGSEGV還是另一個信號?你可以給調試器回溯和本地彙編轉儲?