CPP动态内存回收
CPP dynamic memory recovery
我想知道 c++ 编译器在动态内存分配方面如何与硬件交互。
例如,当 c++ 可执行文件从 OS 请求内存时,该访问有多直接?
如果分配动态内存然后手动重新分配,之后是否仍然可以恢复丢失的数据?也许在 OS 记录中,或者由于内存分配的结果,一旦被编译器解释,就不能完全翻译?
是否可以恢复动态分配的数据?
在大多数操作系统和大多数编译器版本上,当您的程序启动时,会留出一些内存用于 new
和其他动态分配。内存管理器的实现以某种方式对内存进行分区,并设置一些数据结构,以便轻松地为请求提供服务。当您请求内存时,如果有足够大的块来容纳您的请求,内存管理器会将该块交回,并且当您释放某些内容时,它会将其放回池中以供将来考虑。
如果您提出请求但没有 space 可用,内存管理器可以使用两种策略。在某些系统上,对于非常大的分配,内存管理器将只使用 mmap
并让 OS 返回一块内存。在其他情况下,它将使用像 sbrk
这样的系统调用从 OS 中获取更多内存,然后以与现有内存相同的方式进行分割。
如果您在程序中泄漏内存,那么您的程序的内存管理器将永远不会回收该内存,并且只要您的程序处于 运行,它就无法用于您的程序。如果您的程序不再需要该内存,那完全没问题 - 它可以回收以前释放的块 - 但如果它需要更多内存,它将向 OS 请求更多 space.
所有现代操作系统都会在进程退出时自动回收进程分配的所有内存,因此一旦任何进程终止,它分配的所有内存都会被释放。除非是残酷且不寻常的操作系统,否则泄漏大量内存的程序永远不会永久禁止其他程序使用该内存。
需要记住的是,您在程序中使用的所有内存都是虚拟内存,而不是物理内存.每个程序都认为它已完全使用所有系统内存,但实际上 OS 一直在重新定位内存或根据需要将内容分页到磁盘。从这个意义上说,即使您的程序确实向 OS 询问了系统上的所有内存,它也不会阻止其他程序从 运行 中获取 - 它只会导致进程变慢,例如疯了,因为它认为自己的记忆不断被翻进翻出。
我想知道 c++ 编译器在动态内存分配方面如何与硬件交互。
例如,当 c++ 可执行文件从 OS 请求内存时,该访问有多直接?
如果分配动态内存然后手动重新分配,之后是否仍然可以恢复丢失的数据?也许在 OS 记录中,或者由于内存分配的结果,一旦被编译器解释,就不能完全翻译?
是否可以恢复动态分配的数据?
在大多数操作系统和大多数编译器版本上,当您的程序启动时,会留出一些内存用于 new
和其他动态分配。内存管理器的实现以某种方式对内存进行分区,并设置一些数据结构,以便轻松地为请求提供服务。当您请求内存时,如果有足够大的块来容纳您的请求,内存管理器会将该块交回,并且当您释放某些内容时,它会将其放回池中以供将来考虑。
如果您提出请求但没有 space 可用,内存管理器可以使用两种策略。在某些系统上,对于非常大的分配,内存管理器将只使用 mmap
并让 OS 返回一块内存。在其他情况下,它将使用像 sbrk
这样的系统调用从 OS 中获取更多内存,然后以与现有内存相同的方式进行分割。
如果您在程序中泄漏内存,那么您的程序的内存管理器将永远不会回收该内存,并且只要您的程序处于 运行,它就无法用于您的程序。如果您的程序不再需要该内存,那完全没问题 - 它可以回收以前释放的块 - 但如果它需要更多内存,它将向 OS 请求更多 space.
所有现代操作系统都会在进程退出时自动回收进程分配的所有内存,因此一旦任何进程终止,它分配的所有内存都会被释放。除非是残酷且不寻常的操作系统,否则泄漏大量内存的程序永远不会永久禁止其他程序使用该内存。
需要记住的是,您在程序中使用的所有内存都是虚拟内存,而不是物理内存.每个程序都认为它已完全使用所有系统内存,但实际上 OS 一直在重新定位内存或根据需要将内容分页到磁盘。从这个意义上说,即使您的程序确实向 OS 询问了系统上的所有内存,它也不会阻止其他程序从 运行 中获取 - 它只会导致进程变慢,例如疯了,因为它认为自己的记忆不断被翻进翻出。