我的计算机有8 GB的RAM,运行的是Windows Server 2008。当我的应用程序已分配了1.5~1.7GB内存时,malloc()/realloc()无法分配更多内存。我尝试切换到HeapAlloc()/HeapRealloc(),但还是发生了同样的情况。我是否遗漏了什么?是什么原因导致我的应用程序在有明显可用的RAM时无法分配更多的内存?
malloc()
realloc()
HeapAlloc()
HeapRealloc()
mkh04yzy1#
你的机器有多少内存并不重要。Windows上的每个32位进程都有一个4GB的地址空间,其中2GB是用户地址空间。所以你的程序的内存(包括它的代码,加载的dll,堆栈等)将只从这个空间分配。因为你已经接近虚拟地址空间的极限,内存分配失败了。
pu82cl6c2#
默认情况下,在Windows 32位操作系统上,您可以为一个进程使用2DB。如果您使用MSVC编译器,则必须设置LARGEADDRESSAWARE选项。
l7wslrjt3#
当有明显可用的RAM时,是什么原因导致我的应用程序无法分配更多内存?
堆碎片。分配不只是要求内存。它要求连续的内存块。
当然,考虑到您提供的稀疏数据(***当这种情况发生时,您尝试重新分配***多少?这是***32位还是64位***应用程序?),还可能存在其他问题。
3条答案
按热度按时间mkh04yzy1#
你的机器有多少内存并不重要。Windows上的每个32位进程都有一个4GB的地址空间,其中2GB是用户地址空间。所以你的程序的内存(包括它的代码,加载的dll,堆栈等)将只从这个空间分配。因为你已经接近虚拟地址空间的极限,内存分配失败了。
pu82cl6c2#
默认情况下,在Windows 32位操作系统上,您可以为一个进程使用2DB。如果您使用MSVC编译器,则必须设置LARGEADDRESSAWARE选项。
l7wslrjt3#
当有明显可用的RAM时,是什么原因导致我的应用程序无法分配更多内存?
堆碎片。分配不只是要求内存。它要求连续的内存块。
当然,考虑到您提供的稀疏数据(***当这种情况发生时,您尝试重新分配***多少?这是***32位还是64位***应用程序?),还可能存在其他问题。