我在Mac上有C ++代码,看起来像这样:
Object* objectArray = new Object[1000];
// do some stuff...
delete[] objectArray;
现在它汇编很好,并且运行得很好
但是,当我查看进程的Activity Monitor时,我发现即使在执行delete[]
语句后,我也会分配250MB然后再次无法使用。有没有办法在不退出C ++应用程序的情况下再次使用该内存?
答案 0 :(得分:4)
仅仅因为内存不能立即再次可用并不意味着当另一个进程请求更多内存时,操作系统不会从您的进程中获取它。您所看到的内容正在很多程序中发生,并且一再让用户感到困惑,但通常不值得您花时间。如果没有泄漏你没事。
答案 1 :(得分:3)
回应@sftrabbit和@pmr:当你分配一块内存时,操作系统会给你至少那么多标记为“活动”的内存。您将在“系统内存”下的“活动监视器”中看到此术语。然后,当你完成它之后,你至少将其中的一部分标记为“非活动”,这意味着操作系统可以自由出现并在需要时从中获取。实际上回收它有点贵,并且系统假设如果你要求记忆一次,你可能会再次想要它,所以除非有内存压力,否则它不会打扰你。当操作系统确实收回它时,它会将其标记为“免费”,除非某些其他进程立即需要它。
虽然不一定与您的C ++代码相关,但在您的ObjC代码中,您会发现解除分配的内存甚至可能不会出现在“非活动”池中。 Cocoa(真正的CoreFoundation)维护分配的内存块池,它可以快速恢复。这避免了malloc()
的大量开销。与您的问题没有特别的关系,但在Mac应用程序中一般都值得注意。
虽然我普遍认为这不是一个大问题,但我不会完全相信它。分配和释放大块内存仍然很昂贵,并且可能迫使系统进入内存压力状态,在这种情况下它必须实际上为其内存错误处理其他进程,从而降低整体系统性能(然后在其他应用程序时使其更加昂贵)需要稍后分配内存)。如果你可以避免它,那么值得尝试保持你的高水位(你曾经要求的最大记忆)不必要地加标。
但如果你真的需要这个记忆,那不是问题。记忆就可以使用了。
答案 2 :(得分:1)
对new
的调用为对象分配内存。如果空闲存储中没有足够的内存来满足请求,则库会要求操作系统提供更多内存。对delete
的调用不一定会将该内存返回给操作系统。假设程序稍后将从免费存储中使用更多内存,则库通常会挂起该内存。因此,OS级别的工具不会显示内存已被释放,因为这些工具不会查看应用程序的免费存储的内部结构。他们所看到的只是操作系统为应用程序提供了一些内存,但尚未将其恢复。