C++ 强制将内存释放到操作系统

C++ 强制将内存释放到操作系统,c++,C++,我有一个需要20MB内存的应用程序。在一个很少使用的算法中,它(std::vector)临时分配250 MB。解除分配后,systemmonitor仍显示此用法。如何将内存释放回系统?您不能也不应该这样做 虚拟内存分配非常复杂,仅通过在系统监视器中查看一个数字是无法充分理解的。看起来,一个进程使用的内存可能比它应该使用的内存多,但这只是虚拟内存寻址工作方式的一个假象 请放心,如果您正确地释放了这个内存,并且操作系统确实需要它,它将被重新分配 这里唯一真正可行的一点是停止使用System Moni

我有一个需要20MB内存的应用程序。在一个很少使用的算法中,它(std::vector)临时分配250 MB。解除分配后,systemmonitor仍显示此用法。如何将内存释放回系统?

您不能也不应该这样做

虚拟内存分配非常复杂,仅通过在系统监视器中查看一个数字是无法充分理解的。看起来,一个进程使用的内存可能比它应该使用的内存多,但这只是虚拟内存寻址工作方式的一个假象


请放心,如果您正确地释放了这个内存,并且操作系统确实需要它,它将被重新分配

这里唯一真正可行的一点是停止使用System Monitor,就好像它是您的进程正在使用的物理RAM的精确度量一样

使用mmap()或VirtualAlloc()分配和释放内存。这会立即将其返回到操作系统

为了与std::vector一起使用,您需要为它提供一个std::分配器。您可能会发现使用新的直接析构函数调用手动滚动自己的向量更容易


通常,系统堆分配器会为您正确地处理这一问题;但是,您似乎发现了一个案例,但他们没有。

为什么需要发布它?你就不能让它停下来吗?@jalf:可能是担心这是个漏洞,其他程序无法使用这个内存。这是一个合理的问题,因为它显然源于一种误解。内存是直接用于向量还是指向向量中的对象?默认分配器的每个版本都有一个单独块大小的截止值,超过该值时,分配将以不同的方式完成,因此释放将一直返回到操作系统。如果250MB在一个巨大的块(向量中的实际对象)中,那么释放它应该转到操作系统。但是如果内存的直接使用更少,那么症状就更有意义了。在上一次测试中,25万个指向元素的指针被分配了
new
,导致250MB内存的使用。好的,我意识到问题不在于向量将其返回到操作系统并不保证操作系统会决定从进程中取消分配它。通过我命名的系统调用,它确实会这样做。有没有平台无关的方法?没有,但是编写mmap()->VirtualAlloc()包装器是一个很简单的练习,所以你会有一个#ifdef WIN32 void*mmap(…){if(flags&MAP_ANONYMOUS)返回VirtualAlloc(…);否则返回MapViewOfFile(…);}…”“请放心,如果您已正确释放此内存,并且操作系统确实需要它,它将被重新分配。”这是错误的。操作系统不知道进程中的内存已被释放。当内存不足时,操作系统无法深入进程。最多,操作系统可以调出这些页面,占用时间和空间。