我在苹果电脑上有C++代码,看起来像这样:
Object* objectArray = new Object[1000];
// do some stuff...
delete[] objectArray;现在它编译得很棒,运行起来也很棒
但是,当我查看进程的活动监视器时,我发现我分配了250MB,即使在执行delete[]语句之后,这些内存也不再可用。有没有一种方法可以在不退出C++应用程序的情况下使内存再次可用?
发布于 2013-04-30 05:43:56
回应@sftrabbit和@pmr:当你分配一个内存块时,操作系统至少会给你那么多标记为“活动”的内存。您将在系统内存下的活动监视器中看到此术语。然后,当您完成它时,您至少将其中一些标记为“非活动”,这意味着操作系统可以自由地出现并在需要时将其从您手中取走。实际上回收它是有些昂贵的,系统假设如果你请求一次内存,你可能会再次想要它,所以除非有内存压力,否则它不会为了它而困扰你。当操作系统回收它时,它会将它标记为“空闲”,除非其他进程立即需要它。
虽然不一定与您的C++代码相关,但是在您的ObjC代码中,您会发现释放的内存甚至可能不会出现在“非活动”池中。Cocoa (实际上是CoreFoundation)维护着分配的内存块的池,它可以快速地将它们重新分配出去。这避免了malloc()的大量开销。与你的问题不是特别相关,但在Mac应用程序中通常值得注意。
虽然我通常同意这不是一个大问题,但我不会对此完全漫不经心。分配和释放较大的内存块仍然是昂贵的,并且可能迫使系统进入内存压力的情况,在这种情况下,它实际上必须去bug其他进程的内存,从而降低整体系统性能(然后当其他应用程序稍后需要分配内存时,这会使其成本更高)。如果你能避免它,就值得试着保持你的最高值(你曾经请求过的最大内存)不会不必要地达到峰值。
但是如果你真的需要这个内存,这不是问题。内存是要使用的。
发布于 2013-04-30 05:30:42
仅仅因为内存不能立即可用并不意味着当另一个进程请求更多内存时,操作系统不会从你的进程中取出它。你所看到的在很多程序中都在发生,并且一次又一次地让用户感到困惑,但这通常不值得你花时间。如果没有泄漏,你就没问题。
发布于 2013-04-30 05:42:08
对new的调用为对象分配内存。如果空闲存储中没有足够的内存来满足请求,库将要求操作系统提供更多内存。对delete的调用不一定会将该内存返回给操作系统。假设程序稍后将使用空闲存储中的更多内存,库通常会挂起该内存。因此,操作系统级别的工具不会显示内存已被释放,因为这些工具不会查看应用程序的空闲存储的内部结构。他们所看到的是操作系统给了应用程序一些内存,但还没有取回。
https://stackoverflow.com/questions/16288544
复制相似问题