2011-10-10 46 views
0

我C编码的一个程序,使用NX打开C库。我必须将它编译为.dll文件,并将其作为32位计算机上的32位.dll文件运行,效果非常好。然而,当我把相同的代码在Visual Studio 64位计算机上,并指定其编译为64位,和我运行程序,它崩溃上释放一些内存一条线。当我为64位版本注释掉该行时,它运行良好。 NX Open文档指出这是我应该释放的内存。64位版本的DLL免费在内存中崩溃; 32位不

我的问题是这样的:是什么原因造成的?为什么编码完全相同的程序会在64位机器上的64位版本上免费使用内存,而在32位机器上则不会使用32位版本?这是我应该预料到的吗?我做了一些我可以预防的错误吗?或者它是一个更大问题的症状?

版本信息:我使用Visual Studio 2005中,NX 5.0.6.3中,Windows XP SP3

+1

对于任何碰撞,你需要在崩溃(异常,如访问冲突)的位置来检查调用堆栈。除了代码中的错误之外的原因,细节取决于例外细节。 –

+6

有各种各样的这种可能的解释,但最有可能的是,你投一个指向32位整数,从而截断了。在我们可以更具体地帮助之前,您需要缩小它的范围。 –

+0

谢谢...然后,我会在获取它时添加更多信息。 – Rae

回答

2

这很可能是某种类型的内存破坏漏洞。您可以:

  • 解除分配相同的内存两次

  • 与已经释放的内存工作(从而破坏新的内存分配)

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

这个错误很可能存在于32位版本中,但h尚未被发现,因为它从未损坏重要数据。

它可以是很难找到这样的错误。因此,我建议使用诸如Purify,Valgrind或Insure ++之类的内存调试器来检测有问题的内存访问的位置。

+0

我从这个角度开始研究这个问题,发现NX库有一个特殊的UF_free()函数,我应该使用这个函数来代替普通的free()。到目前为止,它似乎可以解决问题,但我会继续寻找,看看我是否失去了其他东西。 – Rae

+0

在这种情况下,我没有使用UF_free(),这意味着有一些内存管理是特定于NX在该函数中进行的。就我所知,这是一个32位和64位的问题,即使它没有出现在32位版本中。 – Rae