我们知道,malloc()
操作new
从堆中动态分配内存,但是堆在哪里呢?每个进程是否在命名空间中都有自己的私有堆用于动态分配,或者操作系统是否有一个由所有进程共享的全局堆。更重要的是,我从一本教科书上读到,一旦发生内存泄漏,丢失的内存在下次重新启动计算机之前是无法重用的。这篇论文对吗?如果答案是肯定的,我们该如何解释呢?
感谢您的回复。
问候。
我们知道,malloc()
操作new
从堆中动态分配内存,但是堆在哪里呢?每个进程是否在命名空间中都有自己的私有堆用于动态分配,或者操作系统是否有一个由所有进程共享的全局堆。更重要的是,我从一本教科书上读到,一旦发生内存泄漏,丢失的内存在下次重新启动计算机之前是无法重用的。这篇论文对吗?如果答案是肯定的,我们该如何解释呢?
感谢您的回复。
问候。
内存是从进程虚拟内存的用户地址空间分配的。当进程终止时,所有内存都由操作系统回收,无需重新启动计算机。
通常,C 运行时将使用各种 OS API 来分配内存,这是其进程地址空间的一部分。在分配的内存中,它将创建一个堆并通过调用malloc或new从该堆中分配内存。
原因是 OS API 通常是粗粒度的,需要您以大块(例如页面大小)分配内存,而您的应用程序通常希望在任何时候分配少量内存。
您没有提及您感兴趣的操作系统。这完全意味着没有直接的答案。
尝试查看一些关于操作系统的书,例如 Tanenbaum 的