2012-01-30 34 views
0

我想爲基於embedded deviceMIPS開發應用程序。我正在使用mipsel-elf-g++交叉編譯器。我實現了一個簡單的代碼,如下圖所示。通過調用對象指針的虛函數引起的段錯誤

class A { 
    public: 
      virtual int getValue(); 
    } 

    class B : public A { 
    public: 
      virtual int getValue(); 
    } 

    int A::getValue() { 
      return 1; 
    } 

    int B::getValue() { 
      return 2; 
    } 

    int main() { 

      A a1; 
      B b1; 
      A* a2 = &a1; 
      B* b2 = &b1; 

      int a_val_1 = a1.getValue(); 
      int b_val_1 = b1.getValue(); 

      int a_val_2 = a2->getValue(); 
      int b_val_2 = b2->getValue(); 

      return 0; 
    } 

a1.getValue()b1.getValue()線工程順利,但是當每個a2->getValue()b2->getValue()線執行,我在屏幕上看到segment fault消息。我認爲其中一個操作系統,編譯器或庫可能已經損壞。我不知道如何找到問題。

有什麼不對?

+2

你應該創建一個最小的工作示例和** **複製該例如進入問題,而不是輸入類似的東西。代碼的語法錯誤指示了另一個錯字(您已經糾正了錯誤),並且糾正語法會生成一個有效的程序,該程序不應該顯示所示的行爲,這似乎表明代碼至少有一處不同。 – 2012-01-30 12:56:41

+0

在修正了類定義中缺少的「;」之後,使用'mips-linux-gnu-g ++'編譯時,MIPS系統上的代碼運行良好。 – markgz 2012-01-30 18:58:20

+0

@markgz:'mipsel-elf-g ++'和'mips-linux-gnu-g ++'有什麼區別?我的嵌入式設備操作系統不是Linux。我可以使用'mips-linux-gnu-g ++'而不是'mipsel-elf-g ++'嗎? – 2012-01-31 10:18:34

回答

2

您有:

B b1; 

和你分配:

B* b2 = &b2; 

它應該是:

B* b2 = &b1; 
+0

是的,但它不應該按照原樣編譯。 – Roddy 2012-01-30 10:07:36

+0

你是對的,這是我的錯誤在我的問題。我編輯我的問題。 – 2012-01-30 10:09:54

+0

你是什麼意思?你是否認爲'在初始化'中不能將'B **'轉換爲'B *'? – 2012-01-30 10:11:07

相關問題