有没有办法保留内存空间以供以后默认使用Windows内存管理器,这样如果我的程序不使用超出我在程序启动时保留的空间,我的应用程序将不会耗尽内存?
答案 0 :(得分:2)
当你拥有虚拟内存时,没有必要做这种事情。
答案 1 :(得分:0)
不含蓄。无法告诉C内存管理器(当您调用malloc
或new
时为您提供内存的内存管理器)以保留空间。
您可以使用自己的专用分配器或缓冲池,并手动管理分配和内存预留。
编辑 -
在Windows上,您可以使用VirtualAllocEx
和VirtualFreeEx
来请求Windows为您保留内存页面。但是没有办法告诉malloc
和new
使用这个记忆。如果你选择走这条路,你需要实现自己的内存管理器。
答案 2 :(得分:0)
在任何特定时刻,您的应用程序不一定具有任何物理内存。
如果您的应用正在等待IO操作一段时间并且用户开始编辑视频,则您的应用可能会完全从物理内存中消失。它只存在于页面文件中。当IO操作完成并且您的一个线程需要再次开始运行时,您将获得一些物理内存。
您真正要分配的只是流程地址空间的一部分。它的一部分可能映射到文件(例如您的EXE或任何不需要重新命名的本机DLL)。其他部分可能是“内存分配”,但实际上这只意味着它们被映射到页面文件中的位置。
在任何可靠的意义上,它都不是“真正的”记忆。
你可以用完的东西就是你的地址空间。如果你分配100MB的块几次,再加上一些较小的块,那么在你将地址空间分段之前不久(默认情况下,它只给你足够的空间容纳大约20个这样的块,并且任何给定的块都必须适合一个连续的区域。)
答案 3 :(得分:0)
虽然这通常是一个非常糟糕的主意(正如其他人已经指出的那样),但Windows确实允许它。如果你真的坚持的话,请查看VirtualLock。至少有99%的时间,这是错误的做法,但它总是可能(尽管极不可能)你正在做的事情落入了证明它的一部分事情的一小部分
答案 4 :(得分:-1)
这甚至不是远程可移植的,但在许多系统中,当你释放它时,你分配的内存不会返回给操作系统,它只是放回到该程序的空闲列表中。
因此,如果您在程序启动时分配一个足够大的块,然后立即释放它,那么从那时起该存储器将可供内存分配器在该程序中分发。
你当然必须确保你的平台以这种方式工作。充其量它虽然是不可移植的,但在最坏的情况下它不会伤害任何东西。