【问题标题】:The value of ESP was not properly saved across a function callESP 的值未在函数调用中正确保存
【发布时间】:2013-07-03 10:53:41
【问题描述】:

我正在开发一个 Visual Studio 项目 项目 A(在编译时生成静态库)

有一个类

using namespace mynamespace;
class projectAclass
{
  virtual int  funct1()=0;  //Pure virtual function
  virtual int funct2()=0;  //Pure virtual function
  virtual int funct3()=0;  //Pure virtual function
};

项目 B(编译时生成 DLL)

#define projectBclass_DLL __declspec( dllexport )
class projectBclass_DLL projectBclass: public mynamespace::projectAclass
{
  //Definitions of the 3 pure virtual functions are here
  int funct1() 
  {
    //definition go here
  }
  //similarly for funct2 and funct3

  int funct4()
 { //Definition goes here    }
  int funct5()
 { //Definition goes here    }
  int funct6()
 { //Definition goes here    }
};

现在从在其他项目中创建的主函数中,我创建了类 projectAclass 的对象并尝试调用函数 funct1 但我不知道其他一些函数当我尝试调试解决方案并从 funct4 返回后,我收到此错误

Run-Time Check Failure #0 - The value of ESP was not properly saved across a
function call.  This is usually a result of calling a function declared with
one calling convention with a function pointer declared with a different calling
convention.

提前致谢

【问题讨论】:

  • 我认为您实际上并没有“创建类 projectAclass 的对象”,因为它是抽象的。
  • 调试器警告只是调用错误函数的副作用。完全不清楚为什么会发生这种情况,但当然你不能在 projectAclass 对象上调用 funct4(),它没有这个函数并且是抽象的,所以永远不能创建,所以这个问题中的信息不准确。跨度>
  • @HansPassant 先生,你能告诉我如何解决这个异常吗(ESP 不正确....)
  • declspec 是否也导出基类?

标签: c++ visual-studio-2010 visual-c++ runtime-error projects-and-solutions


【解决方案1】:

有时您的calling conventions 错误。有时重建一切都会对其进行排序。

【讨论】:

    【解决方案2】:

    确保链接到您的 dll 的静态库、该 dll 和(因为您正在创建 C++ DLL)您的应用程序具有相同的构建配置(DEBUG/RELEASE)。 检查项目中的预处理器标志。错误的预处理器标志会导致不同的虚函数指针表,因此很容易发生调用错误的函数。

    【讨论】:

    • 我已经检查过所有的构建配置都相同,但它仍然给出了异常
    猜你喜欢
    • 2013-11-30
    • 2011-09-17
    • 2013-07-03
    • 2012-04-06
    • 2018-11-28
    • 2015-09-06
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多