什么时候会出现内存页面不可读的情况?

问题描述 投票:0回答:3

这个问题是不言自明的(我认为)。如果程序正在访问内存,例如一次访问 4 个字节,那么什么时候内存恰好是不可读的,而不是说存放垃圾?

c memory
3个回答
3
投票

每当程序不允许读取它时。

这是 MMU 的工作,允许或禁止对内存的访问。这是操作系统的工作,指定允许哪个程序访问哪个内存区域。


3
投票

如果你正确分配/释放/访问内存,那么你永远不会看到这个。 只有当你做错事时才会遇到这种情况。

通常,malloc 是通过子分配内存管理器实现的。例如,如果您要求 malloc 分配 4 个字节的堆内存,那么 C 运行时中的内存管理器将分配一个更大的块,然后再将该块内的 4 个字节分配给您。随后对少量内存的请求将从这些较大的块之一进行子分配。

您可以读取和写入这些大内存块中尚未被 malloc 子分配的区域。 这样做当然是未定义的行为。 请不要这样做! 只要较大的块尚未返回到系统,您还可以读取和写入已释放的子块。 再次强调,请不要这样做。

最常见的是,当程序尝试访问已释放的地址并且包含该地址的内存块已返回到系统时,程序会出现不可读内存错误(也称为分段错误或访问冲突)。 这被称为“陈旧”指针。


0
投票
p

位于有效页面中,并且 p 是某个对齐值 m(除页面大小

n
)的倍数,则

(p+0)/n = (p+1)/n = ... = (p+m-1)/n

p

p+1
、...、
p+m-1

全部指向同一页面。


如果
p
一开始就没有对齐,那么你会遇到比从未映射或不可读页面读取的可能性更大的可移植性问题。
    

© www.soinside.com 2019 - 2024. All rights reserved.