使用函数指针时,ESP 未在函数调用中正确保存
ESP was not properly saved across a function call when using function pointers
我正在尝试创建一个程序,该程序将成员函数的函数指针保存到数组。然后,程序从该数组中获取函数指针,并调用该指针指向的函数。只要使用的成员函数没有任何参数,这就可以工作。当我给它参数时,Visual Studio 2017中会发生以下错误:
运行时检查失败 #0 - ESP 的值未在函数调用中正确保存。 这通常是调用使用一个调用约定声明的函数的结果,该函数指针声明了不同的调用约定。
我的代码是:
typedef uint8_t byte;
template<typename T>
class Test
{
public:
void FuncTest(byte* data)
{
cout << (T)(0.0625f) << endl;
}
};
typedef Test<float> fTest;
typedef Test<long long> lTest;
int main()
{
byte data[1024];
{
void (fTest::*ffp)(byte*) = &fTest::FuncTest;
//void (lTest::*lfp)(byte*) = &lTest::FuncTest;
printf("%pn", ffp);
memcpy(&data[0], (int64*)&ffp, sizeof(int64));
}
{
int64 pData;
memcpy(&pData, &data[0], sizeof(int64));
void(*func_pointer)(byte*) = (void(*) (byte*))(pData);
printf("%pn", pData);
func_pointer(nullptr);
}
}
如果有人能帮忙,将不胜感激。
忽略数组中的存储 你的代码本质上是:
void (Test::*ffp)(byte*) = &fTest::FuncTest;
void* pData = (void*)ffp;
void(*func_pointer)(byte*) = (void(*) (byte*))(pData);
func_pointer(nullptr);
ffp
的类型本质上是(尽管不完全是由于不同的调用约定(void (fTest*, byte*)
与func_pointer
的类型不匹配。
解决方案是将std::function
与std::bind
或 lambda 一起使用来转换函数签名。 例如:
std::vector<std::function<void(byte*)>> functions;
fTest test;
functions.push_back([=](byte* data){ test.FuncTest(data); });
functions.front()(nullptr);
相关文章:
- 函数调用中参数的顺序重要吗
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 变量没有改变?通过向量的函数调用
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 模板函数调用
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 析构函数调用
- 成员函数调用和C++对象模型
- 使用共享指针的函数调用,其对象应为 const
- C++:编译时检查匹配的函数调用对?
- 使用函数指针时,ESP 未在函数调用中正确保存
- 如何调用保存在字符串中的函数
- “ESP 的值未在函数调用中正确保存
- 运行时检查失败 #0 - ESP 的值未在函数调用中正确保存
- 调用约定错误!!(ESP的值没有在函数调用中正确保存)
- 成员函数指针运行时错误——ESP的值在函数调用中没有正确保存
- 如何使void*参数在函数中保存其局部结果,该函数使用struct *调用
- ESP在函数调用中没有保存/运行时错误#0