2013-07-26 24 views
0

我正在调试一个崩溃的程序,因为没有连续的内存可以用于我的向量,需要重新分配。所以我有一个问题,如何不使用虚拟内存?虚拟内存可以用哪种方式使用?谢谢。何时会使用虚拟内存(窗口)?

+0

重新分配需要多少内存? – Inspired

+0

你知道虚拟内存是什么吗? –

回答

2

虚拟内存由操作系统自动使用。你不需要关心这一点。

就你而言,很可能你运行的是32位应用程序。 Windows中32位进程的用户地址空间限制为2 GB(如果使用特定密钥引导Windows,则3 GB)。如果你的向量需要超过几百兆的连续地址空间,这可能会成为一个问题(由于地址空间碎片)。

当然,任何进程可能会耗尽内存(即使在使用虚拟内存和交换文件以及其他任何内容时)。在任务管理器中查看程序的内存使用情况。

+0

目前使用300MB内存,那么这需要重新分配。是的,它是32位应用程序。 Thannks。 – user1558064

1

虚拟内存是您在现代操作系统(Linux,Unix,Windows,MacOS,Symbian等)上运行的程序中唯一获得的内存。

这听起来像你的问题是没有一个连续的虚拟地址范围足够大,你的向量[1]。我怀疑发生了什么事情,比如你需要一个32位的进程超过1.5GB,这个进程一次只能使用2GB,所以在任何一端都没有太多的“空间”来填充其他的数据, “中等”小于1.5GB - 特别是,如果您的矢量正在增长,则需要两个矢量副本,一个是当前大小,另一个大小是要复制的大小。

一个简单的解决方案,假设你知道向量需要多大是被设定它的大小,例如vector<int> vec(some_size);

如果你不知道,有一些更多的解决方案:

如果你有一个64位的操作系统,你可以尝试设置LARGEADDRESSAWARE标志的可执行文件(假设它的Windows)。由于64位操作系统不必为操作系统本身预留大量的内存空间(这超出了32位地址范围,在32位操作系统中),这应该会给您提供更多的内存空间。时,需要启动与/ 3GB的OS,并设置上述标志位。

或编译的代码为64位(升级到一个64位操作系统后,如果需要的话)。

[1]当然,除非你正在编写一个驱动程序,并试图分配的物理内存多兆字节的缓冲区用于DMA - 但我认为你会这么说

0

问题无关记忆,甚至与虚拟内存。一个数组需要一个连续的地址范围速度(通常在Win32程序中为2 GB)是分散的,因此没有足够的可用空间。

如果你可以得到地址,Windows会自动提供虚拟内存与他们一起去。

现在是时候将您的应用程序移动到64位。