我正在调试一个崩溃的程序,因为没有连续的内存可用于需要重新分配的向量。所以我有一个问题,为什么没有使用虚拟内存?虚拟内存可以通过什么方式使用?谢谢。
3 回答
操作系统会自动使用虚拟内存。你不需要关心这个。
在您的情况下,您很可能运行的是 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 程序中通常为 2 GB)是碎片化的,因此没有足够大的可用空间。
如果你能得到地址,Windows 会自动提供虚拟内存来配合它们。
是时候将您的应用程序提升到 64 位了。