【发布时间】: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