2012-03-09 83 views
0

我一直在试图让一段代码工作来重新分配一个巨大的非托管矩阵结构(即std::vector<std::vector<T> >)到一个等效的托管结构(cli::array<T,2>)。由于我无法同时在内存中保存两个结构,我选择写入文件并读取结构。问题是,一旦我删除了原始矩阵,并且因此尝试为矩阵分配托管内存的内存失败。从非托管到托管的矩阵重新分配

我形象这可能与不同的运行时堆cpp vs clr有关。但找不到任何具体的细节。 cpp运行时是否可能保留堆空间,从而阻止clr堆将矩阵分配回来?如果是这样,是否可以强制cpp运行时清理堆空间以便为clr堆留出空间。

现在,为了澄清,目标矩阵必须是一个二维数组,而不是锯齿状数组。我知道这有问题,不能调整大小。否则,我可能可以通过更小的块来移动矩阵。

谢谢,提前。

+0

不能使用锯齿阵列是一个相当人为的限制。它当然可以解决你的地址空间碎片问题。 64位操作系统是简单的解决方法。 – 2012-03-09 13:26:53

回答

0

如果你不能同时在内存中同时存在两个,那么我猜这个数组的大小超过了一个千兆字节。如果你想把它放在一个托管的矩形(非锯齿形)数组中,CLR将不得不寻找一个千兆字节的连续内存......这很容易失败。

您是否尝试过运行64位版本或声明为“大型地址awarene”的32位版本?如果在64位Windows计算机上运行,​​后者将为您提供4千兆字节的地址空间,它可能适合。

+0

我实际上是与flag/largespaceaware链接。目前考虑切换到64位,但不是所有的运行机器都是64位。 CLR是否需要连续记忆?我虽然虚拟地址系统会照顾到这一点,就像它刚刚释放的矢量一样。 – fprades 2012-03-09 11:22:08

+0

二维数组在内存中(在您的应用程序地址空间中)是连续的。您的地址空间可以通过C++代码中的分配来分割。考虑在一个单独的进程中运行你的C++代码。无论如何,您正在创建一个文件来传输数据。 – 2012-03-09 11:32:33