所以我遇到了一个非常奇怪的问题,如果我的代码中不存在这个函数,它就无法工作。它可以是任何名称,它必须存在。我什至有一个exit(EXIT_FALURE)
我的代码中的语句,如果存在,它将运行。 (请注意,这是在多台计算机上发生的)。
基本上我必须有如下所示的代码:
void dosomething()
{
Camera dummyCamera;
dummyCamera.refreshTransform(0,0);
}
但是我可以像这样重命名该函数,它仍然有效
void thisStillWorks()
{
Camera dummyCamera;
dummyCamera.refreshTransform(0,0);
}
无需更改代码中的任何其他内容。该函数从未被显式调用。但是,如果我注释掉方法主体,人们就会在运行时注意到差异。
这是这个奇怪的事情的视频......
无效的解决方案:
- 清理数据
- 注释掉代码
- 在代码库中查找#define
- 删除派生数据
- 在函数体中设置断点(只是跳过)
如果您真的很好奇,可以在此处克隆我们的存储库(您需要自己安装依赖项):
最佳答案
我的一些猜测。
我最好的猜测是你有内存损坏,并且你完全巧合地用这个函数指针覆盖了 vtable 值。或者采取某种无效跳转,由于不同的指令填充而变得可见。要进行调查,请使用 valgrind。
如果不是这种情况,我猜你的编译器/链接器有点坏了。尝试从头开始重新编译所有内容(通过删除所有 .o 文件)。
我可以想象这样一个场景:您的库动态链接,并且您通过索引或其他方式调用动态加载的方法。
你做了:
#define void void myDefaultFunctionNameIamATroll() \/\/
关于未调用的 C++ 函数必须存在,否则代码会爆炸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27306923/