C ++ вызывает неправильную функцию - PullRequest
0 голосов
/ 14 июня 2011

У меня странная ошибка, когда 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++

Таким образом, указатель "grid" указывает на класс, который наследуется от FmeGrid (и только от FmeGrid). saveGridParameters - это виртуальная функция, поэтому может быть из-за этого.

Ответы [ 2 ]

7 голосов
/ 14 июня 2011

Наиболее распространенные причины этого:

  1. Грязная сборка (т.е. интерфейс изменен, но объекты, использующие эти интерфейсы, не были перестроены)
  2. Повреждение стека (вы перезаписали что-то в стеке, что вызывает неправильную функцию и / или правильную функцию с недопустимыми аргументами)

Попробуйте исправить с чистой перестройкой и, если это все еще произойдет, попробуйте инструмент отладки памяти (например, Valgrind), чтобы увидеть, где вы перезаписываете стек.

2 голосов
/ 14 июня 2011

Чтобы добавить к ответу @brandx:

  1. this-> grid-> saveGridParameters () был встроен компилятором и вызывает прямо или косвенно (через другие встроенные функции) ui :: FmeGrid:: setCellSignalValue.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...