何时使用虚拟内存(windows)



我正在调试一个程序,该程序因没有连续内存可用于需要重新分配的向量而崩溃。所以我有一个问题,为什么虚拟内存没有被使用?虚拟内存可以通过哪种方式使用?谢谢

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

在您的情况下,最有可能运行的是32位应用程序。Windows中32位进程的用户地址空间限制为2 GB(如果使用特定密钥启动Windows,则为3 GB)。如果您的矢量需要超过几百兆字节的连续地址空间,这可能会成为一个问题(由于地址空间碎片)。

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

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

听起来你的问题是,没有一个连续的虚拟地址范围足够大,可以容纳你的向量[1]。我怀疑正在发生的情况是,比如说,在一个32位进程中,你需要超过1.5GB,而这个进程一次只能使用2GB,所以在"中间"小于1.5GB之前,两端都没有太多的"空间"来填充其他位-特别是,如果你有一个正在增长的矢量,你需要两个矢量的副本,一个是当前大小,另一个是两倍大小的副本。

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

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

如果您有一个64位操作系统,您可以尝试为可执行文件设置LARGEADDRESSAWARE标志(假设它是Windows)。这应该会给你更多的内存,因为64位操作系统不必为操作系统本身保留很大的内存空间(它在32位地址范围之外)。在32位操作系统中,你需要用/3GB引导操作系统,并设置上述标志。

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

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

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

如果你能得到这些地址,Windows会自动提供虚拟内存。

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

最新更新