CPP动态内存恢复

时间:2016-11-24 18:55:57

标签: c++11 memory-management recovery

我想知道c ++编译器如何在动态内存分配方面与硬件交互。

例如,当c ++可执行文件从操作系统请求内存时,该访问有多直接?

如果分配了动态内存然后手动重新分配,之后是否仍然可以恢复丢失的数据?也许在操作系统记录中或由于内存分配不能完全翻译一次由编译器解释?

是否可以恢复动态分配的数据?

1 个答案:

答案 0 :(得分:1)

在大多数操作系统和大多数编译器版本中,当程序启动时,会留出一些内存用于new和其他动态分配。内存管理器的实现以某种方式对内存进行分区,并设置一些数据结构,以便轻松地为请求提供服务。当您请求内存时,如果有足够大的块来保存您的请求,则内存管理器会将该块移回,当您取消分配某些内容时,它会将其放回池中以供将来考虑。

如果您提出请求并且没有可用空间,则内存管理器可以使用几种策略。在某些系统上,对于非常大的分配,内存管理器将只使用mmap并让操作系统返回一块内存。在其他情况下,它将使用类似sbrk的系统调用来从操作系统获取更多内存,然后以与现有内存相同的方式进行分割。

如果您的程序中存在内存泄漏,那么程序的内存管理器将永远不会回收该内存,只要您的程序正在运行,它就无法用于您的程序。如果你的程序再也不需要那个内存,那就完全没问题了 - 它可以回收以前解除分配的块 - 但是如果它需要更多的内存,它会向操作系统请求更多的空间。

当进程退出时,所有现代操作系统都将自动回收进程分配的所有内存,因此只要任何进程终止所有分配的内存就会被释放。除了一个残酷和不寻常的操作系统,泄漏大量内存的程序永远不会永久禁止其他程序使用该内存。

要记住的是,您在程序中使用的所有内存都是虚拟内存,而不是物理内存。每个程序都认为它已经完全使用了所有系统内存,但实际上操作系统一直在重新定位内存或根据需要将内容分配到磁盘。从这个意义上说,即使你的程序确实要求操作系统获取系统上的所有内存,它也不会阻止其他程序运行 - 这只会导致进程像它认为的内存一样疯狂地放慢速度它不断被打入和关闭。