c++ - 在 VC++2010 环境之外运行时程序立即崩溃

标签 c++ windows visual-studio-2010 debugging crash

我有一个程序我已经工作了几个星期,在过去的几天里我做了一些大的改变,现在我不明白为什么这个程序在 VC++2010 环境之外不起作用.

当我打开项目时,程序完美运行,从解决方案配置下拉菜单中选择发布或调试,然后按 F5。但是,当我从 Release/Debug 文件夹中获取可执行文件时,将其放在可以访问我正在使用的 Assets 的位置,然后运行它,它会加载几秒钟,然后显示这个可爱的错误“Project.exe has停止工作 - Windows 正在检查问题的解决方案......”当然,像往常一样,Windows 无法找到问题的解决方案。

在阅读所有这些代码之前快速免责声明:虽然错误是由代码更改引起的,但不确定是哪个更改引起的,因为我一次更改了一些东西 - 我知道这很愚蠢,但它发生了.我已经从最可能的错误来源发布了代码。如果您相信我的编码习惯,请滚动到“我的第二个想法:”。

我最近所做的最大更改涉及我的输入处理程序,并通过函数指针集成键绑定(bind)(我没有任何经验)。我在 RawInput 中定义了一个函数指针数组像这样上课:

typedef  void (Application::*AppFunc)(void);
typedef  void (Application::*AppFuncDelta)(int delta);

AppFunc onKeyPress[256];
AppFunc onKeyRelease[256];
AppFunc onMouseButtonPress[5];
AppFunc onMouseButtonRelease[5];

AppFuncDelta onMouseMove[3];

我已通知 RawInput类到 Application通过直接在其自己的类定义上方声明原型(prototype)来类,如下所示:
class Application;
我在 Application::Initialize() 中像这样填充这些数组(我定义了很多键,所以这里是一个摘录):
m_RawInput->onMouseMove[0] = &Application::mouseMoveX;
m_RawInput->onMouseMove[1] = &Application::mouseMoveY;

哪里Application::mouseMoveXApplication::mouseMoveY采用 int 的函数参数并且不返回值。

这些函数在 RawInput::Interpret(LPARAM lParam) 内部调用像这样:
if (raw->data.keyboard.Flags & RI_KEY_BREAK) //key released
{
    if (onKeyRelease[raw->data.keyboard.VKey] && g_app) (g_app->*onKeyRelease[raw->data.keyboard.VKey])();
    return;
}
else //key pressed down
{
    if (onKeyPress[raw->data.keyboard.VKey] && g_app) (g_app->*onKeyPress[raw->data.keyboard.VKey])();
    return;
}
g_appinput.cpp 中定义如 extern Application *g_app .我用过 g_app既然方案的构思,也绝对不是问题。

我在这个更新中遇到的第一个问题在于一个空函数指针,但现在我运行检查指定函数的有效性和 g_app 的有效性。在调用任何函数之前。无论如何,这个错误会在 VC++ 环境内部和外部发生,我怀疑这不是问题。

在我自己询问之前,我搜索了一段时间并找到了这个 nearly identical question也在 Stack Overflow 上。对我来说可悲的是,它仍然没有答案。

我也发现了this tool (称为dependency walker),它遍历可执行文件的所有依赖项,并让您知道是否找不到其中的某些依赖项。它找不到(我也找不到最终版本)这些 DLL:
API-MS-WIN-APPMODEL-RUNTIME-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-ERROR-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-ROBUFFER-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-STRING-L1-1-0.DLL
API-MS-WIN-SHCORE-SCALING-L1-1-1.DLL
DCOMP.DLL
GPSVC.DLL
IESHIMS.DLL

我的两个想法之一是 RawInput不能调用它不知道的函数 - 并且它不知道 Application 中的任何函数.但是我现在的#include层次结构使 RawInput 变得非常困难了解这些功能。

我的第二个想法:

当程序在 IDE 内部或外部运行时,只有 3 件事(根据 Vivian De Smedt )会发生变化:

1.) 传递给程序的参数。 //perhaps
2.) 应用程序的工作目录。 //has not changed
3.) 如果在启动 Visual Studio 后更改环境变量(或者如果使用此类启动器,则在启动启动器后更改它们:例如:Explorer++)//I suspect this to be the problem. Ideas?
我完全迷失在这个问题上,我花了大量时间来提出这个问题。任何建议都非常感谢。我会在 15 分钟内,所以如果我在任何地方失去了你,请要求澄清:)

最佳答案

xP 抱歉浪费你的时间,伙计们。我完全把你引向了错误的方向。除以 0 是由于 %两个未初始化变量中间的运算符。

对于任何阅读此内容的人来说,这只是一种有趣的事情:
uninitialized_variable1 % uninitialized_variable2是一个没有附加调试器的错误,而它在调试器的环境中评估为零。

关于c++ - 在 VC++2010 环境之外运行时程序立即崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20872122/

相关文章:

c++ - 检查预处理器符号的值(#define)

c++ - 从函数返回对象时调用C++中的复制构造函数?

c++ - 我正在尝试在 Visual Studio 2010 中编译 C++ 代码,但出现链接器错误

c++ - 使用 pqxx 编译程序时出现问题

c++ - 在特定的 cmake 目标之前运行 npm 命令

c++ - IIS 下的 Windows 命名管道 ACL

ruby-on-rails - Gemfile.lock 应该致力于 Windows 上的源代码管理吗?

windows - 谁是剪贴板的系统所有者?

visual-studio-2010 - 如何对仅限管理员的功能进行单元测试?

visual-studio - VSX:自定义项目类型