【问题标题】:64-bit version of DLL crashes on memory free; 32-bit does not64 位版本的 DLL 在可用内存时崩溃; 32位没有
【发布时间】:2011-12-04 12:09:10
【问题描述】:

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

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

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

【问题讨论】:

  • 对于任何崩溃,都需要在崩溃(异常,如访问冲突)位置检查调用堆栈。原因不是代码中的错误,细节取决于异常细节。
  • 对此有各种可能的解释,但最有可能的是您将指针转换为 32 位整数并因此截断了它。在我们提供更具体的帮助之前,您需要缩小范围。
  • 谢谢...我会在获得信息后添加更多信息。

标签: c visual-studio-2005 32bit-64bit dll


【解决方案1】:

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

  • 两次释放相同的内存

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

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

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

很难找到这样的错误。因此,我建议使用诸如 Purify、Valgrind 或 Insure++ 之类的内存调试器来检测有问题的内存访问在哪里。

【讨论】:

  • 我已经开始从这个角度看待问题,发现 NX 库有一个特殊的 UF_free() 函数,我应该使用它来代替常规的 free()。到目前为止,它似乎可以解决问题,但我会继续查看是否还有其他问题。
  • 在这种情况下我没有使用 UF_free() ,这意味着在该函数中存在一些特定于 NX 的内存管理。据我所知,这在 32 位和 64 位中都是一个问题,尽管它没有出现在 32 位版本中。
猜你喜欢
  • 1970-01-01
  • 2012-01-13
  • 2016-06-04
  • 2020-03-17
  • 2016-05-28
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
相关资源
最近更新 更多