2011-06-14 62 views
0

我有這個奇怪的錯誤,其中C++調用錯誤的函數:C++調用錯誤的函數

所以這段代碼被調用:

class FmeGrid 
    { 
    // .... 
    virtual void saveGridParameters() const; 
    virtual void setCellSignalValue(int row, int col, double double_value, const std::string& string_value); 
    // .... 
    } 

    void EnfClientFrame::saveGridParameters() 
    { 
    this->grid->saveGridParameters(); 
    } 

而在堆棧中的下一個函數被調用是:

void FmeGrid::setCellSignalValue(int row, int col, double double_value, const std::string& string_value) 
    { 
    this->setCellString(row, col, string_value, wxALIGN_RIGHT); 
    this->setCellBackground(row, col, GetSignalColour(double_value)); 
    } 

有了完全隨機的值,這裏是堆棧:

enf_client.exe!ui::FmeGrid::setCellSignalValue(int row=1239452, int col=1239236, double double_value=-9.2559592117431994e+061, const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & string_value={...}) Line 468 + 0x23 bytes C++ 
enf_client.exe!ui::EnfClientFrame::saveGridParameters() Line 170 + 0x20 bytes C++ 

所以「網格」指針指向一個從FmeGrid繼承的類(並且只能從FmeGrid繼承)。 saveGridParameters是一個虛函數,所以可能是因爲這個。

+0

嗯 SaveGridParameters是什麼樣的?它在FmeGrid中被覆蓋了嗎?它是否存在於另一個.dll中,並且是否在同一時間構建它們? 如果它是在另一個DLL中,它可能是你遇到某種.lib .dll衝突或其他東西,或它不是正確的, 不確定這些足夠的信息真的說,但...... – NotJarvis 2011-06-14 08:05:06

+4

你試過清潔和重建您的項目? – sergio 2011-06-14 08:05:23

+0

你在發佈模式下調試嗎?我通常在發佈模式下得到這個。 – RvdK 2011-06-14 08:05:38

回答

7

這種最常見的原因有:

  1. 骯髒的版本(即界面更改,但使用這些接口並沒有重建對象)
  2. 堆棧腐敗(你改寫堆棧上的東西是導致錯誤的函數被調用和/或帶有無效參數的正確函數)

嘗試使用乾淨重建來修復,堆棧。

+0

對象也可能被無效指針損壞,或者堆可能已損壞。 – Puppy 2011-06-14 08:15:30

+0

我從函數中刪除了虛擬限定符,它工作正常。虛擬表格可能已損壞。 – Arthur 2011-06-14 08:41:53

2

要添加到@brandx答案:

  1. 這 - >網格狀> saveGridParameters()已經由編譯器內聯和直接或間接地調用(經由其他聯函數)UI :: FmeGrid :: setCellSignalValue 。