C++调用了错误的函数

发布于 2024-11-15 07:50:32 字数 1188 浏览 1 评论 0原文

我有一个奇怪的错误,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 是一个虚函数,所以可能是因为这个原因。

I have this weird bug, where C++ calls the wrong function:

So this bit of code get called:

  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();
  }

And the next function in the stack that is called is:

  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));
  }

With totally random values, here is the stack:

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++

So the "grid" pointer points to a class that inherits from FmeGrid (and only from FmeGrid).
saveGridParameters is a virtual function, so it may be because of that.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

要走就滚别墨迹 2024-11-22 07:50:32

最常见的原因是:

  1. 脏构建(即接口已更改,但使用这些接口的对象未重建)
  2. 堆栈损坏(您覆盖了堆栈上的某些内容,导致调用错误的函数和/或使用无效的正确函数 尝试使用干净的重建来修复

,如果仍然发生,则尝试内存调试工具(如 Valgrind)来查看覆盖堆栈的位置。

Most common causes for this are:

  1. Dirty build (i.e. interface changed, but objects that used those interfaces weren't rebuilt)
  2. Stack corruption (you overwrote something on the stack that's causing the wrong function to be called and/or the correct function with invalid arguments)

Try fixing with a clean rebuild and if it still happens, then try a memory debugging tool (like Valgrind) to see where you're overwriting the stack.

掩于岁月 2024-11-22 07:50:32

添加到 @brandx 答案:

  1. this->grid->saveGridParameters() 已由编译器内联并直接或间接调用(通过其他内联函数) ui::FmeGrid::setCellSignalValue。

To add to @brandx answer:

  1. this->grid->saveGridParameters() has been inlined by a compiler and calls directly or indirectly (via other inlined functions) ui::FmeGrid::setCellSignalValue.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文