C 64位版本的DLL在内存空闲时崩溃;32位不可用

C 64位版本的DLL在内存空闲时崩溃;32位不可用,c,visual-studio-2005,32bit-64bit,dll,C,Visual Studio 2005,32bit 64bit,Dll,我已经用C编写了一个程序,它使用NX OpenC库。我必须把它编译成一个.dll,作为32位机器上的一个32位.dll,它工作得非常好。但是,当我将相同的代码放在64位机器上的VisualStudio中,并指定它编译为64位,然后运行该程序时,它会在释放一些内存的行上崩溃。当我注释掉64位版本的那一行时,它运行良好。NX Open文档表明这是我应该释放的内存 我的问题是:这是什么原因造成的?为什么一个编码完全相同的程序在64位机器上的64位版本内存空闲时崩溃,而在32位机器上的32位版本内存空闲

我已经用C编写了一个程序,它使用NX OpenC库。我必须把它编译成一个.dll,作为32位机器上的一个32位.dll,它工作得非常好。但是,当我将相同的代码放在64位机器上的VisualStudio中,并指定它编译为64位,然后运行该程序时,它会在释放一些内存的行上崩溃。当我注释掉64位版本的那一行时,它运行良好。NX Open文档表明这是我应该释放的内存

我的问题是:这是什么原因造成的?为什么一个编码完全相同的程序在64位机器上的64位版本内存空闲时崩溃,而在32位机器上的32位版本内存空闲时崩溃?这是我应该预料到的吗?我做错了什么可以防止的事了吗?还是更大问题的征兆


版本信息:我使用的是Visual Studio 2005、NX 5.0.6.3、Windows XP SP3

这很可能是某种内存损坏错误。你可以:

  • 释放同一内存两次

  • 使用已释放的内存(从而破坏新的内存分配)

  • 在分配的内存之外写入(从而破坏其他分配或内存管理结构)

该漏洞可能也存在于32位版本中,但尚未被发现,因为它从未损坏过基本数据


很难找到这样一个bug。因此,我建议使用Purify、Valgrind或Insure++等内存调试器来检测问题内存访问的位置。

对于任何崩溃,您需要在崩溃(异常,如访问冲突)位置检查调用堆栈。除了代码中的错误之外,详细信息取决于异常详细信息。对此有各种可能的解释,但最有可能的是您将指针强制转换为32位整数,从而截断了它。在我们提供更具体的帮助之前,您需要将其缩小一点。谢谢……我会在获取时添加更多信息。我已经开始从这个角度来看问题,并发现NX库有一个特殊的UF_free()函数,我应该使用它来代替常规的free()。到目前为止,它似乎可以解决问题,但我将继续查看是否遗漏了其他内容。事实上,在本例中我没有使用UF_free(),这意味着该函数中存在特定于NX的内存管理。据我所知,这在32位和64位都是一个问题,尽管它在32位版本中没有出现。