如果我让程序运行一段时间,就会出现异常 平台:Win32 语言:C++

如果我让程序运行一段时间,就会出现异常 平台:Win32 语言:C++,c++,winapi,memory-leaks,C++,Winapi,Memory Leaks,如果我让程序运行一段时间(~10分钟),就会出现错误 ImportTest.exe中0x10003fe2处的未处理异常:0xC0000005:访问冲突读取位置0x003b1000 我认为可能是内存泄漏,但我不知道如何找出原因。 我也无法“释放()”内存,因为它总是导致(也许我不应该在变量上使用free()): ImportSet.exe中0x76e81f70处未处理的异常:0xC0000005:访问冲突读取位置0x0fffffff 在那个阶段,程序什么也不做,只是等待用户输入 编辑2: play

如果我让程序运行一段时间(~10分钟),就会出现错误

ImportTest.exe中0x10003fe2处的未处理异常:0xC0000005:访问冲突读取位置0x003b1000

我认为可能是内存泄漏,但我不知道如何找出原因。

我也无法“释放()”内存,因为它总是导致(也许我不应该在变量上使用free()):

ImportSet.exe中0x76e81f70处未处理的异常:0xC0000005:访问冲突读取位置0x0fffffff


在那个阶段,程序什么也不做,只是等待用户输入 编辑2:
playSongPtr()导致问题。但是我不知道如何修复它。

错误告诉您,内存被访问,而您目前尚未分配内存。这可能是一个指针错误,比如取消引用
NULL
。另一种可能是在释放内存后使用它


第一步是检查您的代码是否有
NULL
引用检查,即在使用它之前确保您有一个有效的指针,并检查所有已分配和已释放资源的生命周期。在刚刚释放的引用上写入
NULL
,可能有助于找到问题所在。

我认为很明显,您的程序有一个bug。如果你不知道从哪里开始寻找,一个有用的技巧是“分而治之”

从您的程序开始,使其处于可以导致异常发生的状态。删除一半代码,然后重试。如果异常仍然发生,那么您将有一半的代码需要查看。如果异常没有发生,那么它可能与您刚才删除的代码有关

重复上述步骤,直到找到问题


更新:您说“在该阶段,程序没有做任何事情”,但显然它正在做一些事情(否则它不会崩溃)。您的程序是控制台模式程序吗?如果是,您使用什么函数等待用户输入?如果不是,那么它是GUI模式程序吗?您是否打开了一个对话框,正在等待发生什么事情?你有运行Windows定时器吗?有线索吗


更新2:根据您发布的一小段代码,我很确定如果您尝试删除对
playSongPtr(songHandle)
函数的调用,那么您的问题很可能会消失。您必须调查“miniFMOD.dll”的要求是什么。例如,该DLL可能假定它在GUI环境中运行,而不是在控制台程序中运行,并且可能会做一些不一定在控制台模式下工作的事情。此外,为了在后台执行任何操作(包括播放歌曲),该DLL可能需要创建一个线程来定期加载歌曲的下一位并将其排入播放缓冲区。您可以在任务管理器(或者更好的,Process Explorer)中检查程序创建的线程数。如果它不止一个,那么还有其他一些事情是你无法直接控制的。

我怀疑这个特殊的问题是内存泄漏;问题是取消对不指向有用内容的指针的引用。要检查内存泄漏,请在操作系统的进程列表工具(任务管理器、ps等)中观察进程,并查看“已用内存”值是否持续增长

在调用free时:应该对malloc()、calloc()或strdup()返回的非null值调用free()一次,并且只调用一次。少于一次调用free()将导致内存泄漏。多次调用free()将导致内存损坏


您应该获得堆栈跟踪,以查看进程崩溃时发生的情况。根据我对涉及的地址的阅读,您可能有堆栈溢出或使用堆栈地址进行了不正确的指针计算(在C/C++术语中:一个“自动”变量)堆栈跟踪将告诉您它是如何到达崩溃点的。

尝试在调试器中运行该程序,并查看是否出现异常。立即执行该操作……该程序没有执行任何操作,只是在等待用户输入。这意味着:当异常发生时,查看堆栈跟踪以了解其来源。您不应该释放()任何您尚未释放的内容。不应该释放变量。向我们展示您的代码。这是一个控制台应用程序,我正在使用getch();从conio.h暂停程序。我正在等待用户按下一个键,以便程序可以继续运行。不,我没有在这个程序中使用任何线程。好吧,就其本身而言,我们还没有足够的信息来猜测可能发生的事情。你能发布一些代码来演示这个问题吗?你有没有可能在playSongPtr方法中启动一个新线程?我怀疑是罪魁祸首。但在歌曲播放结束后很久,程序就崩溃了。这并不意味着什么。您是否尝试删除对
playSongPtr()
的调用?
dllHandle = LoadLibrary(L"miniFMOD.dll");

playSongPtr = (playSongT)GetProcAddress(dllHandle,"SongPlay");
loadSongPtr = (loadSongT)GetProcAddress(dllHandle,"SongLoadFromFile");

int songHandle = loadSongPtr("FILE_PATH");

// ... {just output , couldn't cause errors}

playSongPtr(songHandle);
getch(); // that is where it causes an error if i leave it running for a while