Windows 10是否保护您访问另一个程序正在使用的内存?

以下C ++代码工作:

int *p = new int; p[1000] = 12; 

意思是我访问一个内存位置是sizeof(int)* 1000字节远离p。

我在想的是,也许Windows或任何其他程序正在使用内存位置&P [1000]的东西。 如果我厌倦将p [1000]设置为一个新的值,那么另一个程序,甚至是可能使用该位置来存储内存的Windows,都可能会崩溃,因为我更改了该程序的一个重要variables。

由于C ++不禁止这个,所以我想知道至lessWindows是否对使用其他人当前使用的内存位置的程序有某种保护。

在Windows(以及所有其他现代消费者操作系统)上写入不属于您的内存地址不会直接影响属于任何其他进程的内存。

但是,操作系统可能正在使用该内存为您的程序提供必要的服务,或者该地址可能根本无效,因此覆盖您不属于的地址可能会导致程序崩溃或意外运行,无论是立即或在未来的一些不可预测的点。 谷歌“未定义的行为”为更多的讨论为什么这是一件坏事。

在Windows的情况下,我有一个模糊的回忆,GUI使用一些用户模式共享内存(为了效率),所以如果你真的不走运,那么写错地址可能会导致其他GUI程序故障,甚至整个GUI变得没有响应,从用户的角度来看,这看起来非常类似于操作系统挂起。 但是,我不认为我曾经见过这样的事情,所以也许我的信息已经过时,或者有保护机制来减少这种情况。 (这并不代表安全漏洞,因为它只影响用户的其他程序,恶意程序可以通过任何其他更可靠的方式实现相同的效果。)

内存被组织成PAGES。 每个进程都会看到一个逻辑地址空间,由编号为0-N的页面组成。

逻辑地址空间分为两个范围:用户空间和系统空间。

每个进程都有自己独特的用户空间,所有进程共享相同的系统空间。 您的用户空间页面10映射到不同的物理位置,然后映射到其他进程的用户空间页面10(大多数情况下)。

系统空间中的内存不受用户模式访问的保护。 写入它的唯一方法是切换到内核模式。 操作系统限制了如何调用特定的系统服务。 所以,如果没有错误(但是我们在这里说M $),你不应该能够毫不犹豫地修改系统空间。

两个应用程序可以映射内存,使得它们以用户模式共享内存位置。 在这种情况下,你可以把事情搞砸。 但是,您必须在两个进程中显式映射内存。

每个进程都有自己的地址空间。 这个空间被映射到真正的地址。 它们不重叠。