操作系统是否知道程序在操作系统给出的内存块中进行了malloc或释放了任何内存位置



最近,我发现了一些有趣的代码。

int main()
{
int* a = new int;
*a = 5;
int* b = a;
delete a;
std::cout << *b << std::endl;
}

即使这是";未定义的行为";,大多数情况下效果很好。它打印'5'
我了解到这是因为程序正在从操作系统访问已经分配的内存块(可能是页面??(,它没有给出任何异常。

我有个问题。操作系统能知道程序是否分配和释放内存块中的内存吗
或者程序是否管理可用内存列表?(如果程序管理这个,为什么它在访问释放的位置时不给出任何异常(b((

我想知道这些东西是如何详细工作的
我想知道程序什么时候把内存块还给操作系统。

我正在开发windows x64。

首先,我将从C++的角度回答:

操作系统知道程序在操作系统给出的内存块中进行了malloc或释放了任何内存位置吗?

操作系统能知道程序是否在内存块中分配和释放内存吗??

我想知道程序什么时候把内存块还给操作系统。

这些不是由C++语言指定的。

大多数情况下它运行良好。

否。具有未定义行为的程序不会";工作良好";,即使看起来是这样。

它打印'5'

这是一种可能的行为。当程序的行为未定义时,这是不能保证的。

我了解到这是因为程序正在从操作系统访问已经分配的内存块(可能是页面??(,它不会给出任何异常。

它不会给出任何异常,因为程序的行为是未定义的,所以不能保证会这样做。


这里我将从操作系统的角度介绍一些内容。不幸的是,我对Windows的具体知识并不深入,所以这是一般性的,而不是具体的。

或者程序管理可用内存列表吗?

在实践中,必须管理一个描述所有分配器的数据结构。无论是直接的语言实现(编译器/运行库(还是操作系统,都会因系统而异。我听说在Windows上,调试版本和发布版本之间的差异也会有所不同。

(如果程序管理这个,为什么它在访问释放的位置时不给出任何异常(b((

无论这样的列表是由语言实现(编译器/运行库(还是由操作系统管理,都不会进行这样的检查,因为每次访问内存时检查这样的列表在处理器时间方面会非常昂贵。实现该语言或操作系统的人认为,将每个程序的速度降低一个重要因素是不值得增加安全性的。

操作系统通常处理"内存"中的虚拟存储器;页面";它们是大块。当一个未映射到内存中的页面被访问时,操作系统通常会在这一点上检查程序是否应该访问它。如果没有,那么为了安全起见,程序通常会被终止,因为它被认为行为不稳定。这些页面是对内存的粗略划分,而不是单独的分配。

我想知道程序什么时候把内存块还给操作系统。

同样,实现和情况各不相同。通常情况下,内存根本不返回给操作系统,而是用于以后的分配。通过";"完全";,我的意思是,进程会保留内存,直到它被终止。

最新更新