C++调用错误的函数

Art*_*hur 0 c++ inheritance virtual-functions

我有这个奇怪的错误,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();
  }
Run Code Online (Sandbox Code Playgroud)

并且调用的堆栈中的下一个函数是:

  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));
  }
Run Code Online (Sandbox Code Playgroud)

使用完全随机的值,这里是堆栈:

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++
Run Code Online (Sandbox Code Playgroud)

所以"网格"指针指向一个继承自FmeGrid的类(并且只从FmeGrid继承).saveGridParameters是一个虚函数,因此可能就是这样.

小智 7

最常见的原因是:

  1. 脏构建(即接口已更改,但使用这些接口的对象未重建)
  2. 堆栈损坏(你在堆栈上覆盖了导致调用错误函数的东西和/或带有无效参数的正确函数)

尝试使用干净的重建进行修复,如果仍然发生,请尝试使用内存调试工具(如Valgrind)来查看覆盖堆栈的位置.