【问题标题】:32 bit works fine but 64 bit gives error: Microsoft C++ exception: _com_error at memory location32 位工作正常,但 64 位给出错误:Microsoft C++ 异常:_com_error at memory location
【发布时间】:2014-11-28 22:37:02
【问题描述】:

我的 Visual Studio C++ 2008 项目在 32 位平台上以调试和发布模式构建可执行文件,没有任何问题,可执行文件运行并生成预期结果。

我有一些矩阵大小超过 26000 行乘 26000 列(双精度类型),在 32 位平台上我无法为这些矩阵分配内存。因此我必须切换到 64 位平台。

在 64 位平台上,我可以构建可执行文件而不会出现任何错误(调试和发布模式),但是在尝试运行可执行文件时,我在调试模式下收到以下消息:

以及发布模式下的以下消息:

我在调试模式下单步调试代码,我收到的第一条消息是这样的(发生在 Microsoft COM):

每次我在上一条消息上单击继续时,都会在名为 STAADLibBentley.tli 的文件的不同位置出现不同的错误消息,如下面所示的两个示例:

STAADLibBentley.tli 的顶部写了以下 cmets,这表明 TLB 文件是针对 Win32 的,并且编译器正在实现 TLB 文件的包装器以在 64 位平台上使用它。

看起来这个 STAADLibBentley.tli 文件是由编译器自动实现的包装器,与我在下面的 C++ 代码中使用的 STAADLibBentley.tlb 文件相关,并且与 STAAD API 相关,STAAD 是我使用的软件'正在通过 TLB 库进行通信。我正在使用这样的 TLB 文件:

现在的问题是,如果编译器正在为 Win32 TLB 文件编写一个包装器以在 64 平台上使用它,为什么我会在 STAADLibBentley.tli 文件中收到上述错误消息。有谁知道可能的原因是什么?

【问题讨论】:

  • (26000 * 26000 * sizeof(double)) / (1024 * 1024 * 1024) = 5GB。你不能分配那么多。我非常怀疑你能做到。我运行具有 32GB 内存的 64 位系统,但在任何给定实例上我仍然只能分配 4GB。我认为计算机不能连续找到超过 4GB 的空间。或者有限制。
  • 嗯.. 我刚才使用了 new 的 no-throw 版本,并且能够连续分配 21GB,但像地狱一样滞后!我正在关注这篇文章:stackoverflow.com/questions/17952731/… 没有无投掷,它将std::bad_alloc 投掷到 4GB。我想你可以使用无投掷或只分配合理的块,而不是尝试一次分配所有 5GB。也许一次分配 100mb - 500mb 并跟踪它。并非每台计算机都有大量内存。不确定这个解决方案是否适用于矩阵......
  • 错误似乎不是bad_alloc - 我们确定代码实际上正常运行吗?如果你使用更小的尺寸,你会遇到同样的问题吗?
  • 另外,代码是否可能包含“硬编码大小”,例如使用4而不是sizeof(*int)
  • 对,您当前的错误不是 bad_alloc,但似乎是内存损坏类型的错误,这让我认为某些内容可能会越界。

标签: c++ exception com crash 32bit-64bit


【解决方案1】:

我与熟悉 STAAD 软件 API 的人交谈,我被告知该 API 是 32 位 Microsoft COM 的组件,而不是 64 位。幸运的是,在 64 位平台上使用 32 位 COM 有一些技巧,如下链接,我可以尝试一下:

http://www.gfi.com/blog/32bit-object-64bit-environment/

Getting the GUID of an installed COM object

【讨论】:

    猜你喜欢
    • 2011-10-20
    • 2022-06-24
    • 2020-09-11
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多