6

我想知道......如果你做一个新的,预订开始的地址是0x0怎么办?我想这是不可能的,但为什么呢?新运营商是否为此做好了准备?第一个字节的那部分不可用吗?操作系统启动时总是保留它?

谢谢!

4

4 回答 4

12

指针不一定是地址0x0,因此架构可能会选择另一个地址来表示空指针,并且您可以从中获取0x0有效new地址。(我认为没有人这样做,顺便说一句,它会破坏大量memset调用背后的逻辑,而且无论如何它更难实现)。

空指针是由操作系统保留还是C++ 实现未指定,但 plainnew永远不会返回空指针,无论它的地址是什么(nothrownew是一个不同的野兽)。所以,回答你的问题:

内存地址 0x0 可用吗?

也许,这取决于特定的实现/架构。

于 2013-01-18T21:43:07.157 回答
3

“早期”内存地址通常为操作系统保留。操作系统不使用早期物理内存地址来匹配虚拟内存地址以供用户程序使用。根据操作系统,可以有很多东西——中断向量表、页表等。

这是 Linux 中物理和虚拟内存布局的非特定图;从发行版到发行版以及发布到发布可能会略有不同:

http://etutorials.org/shared/images/tutorials/tutorial_101/bels_0206.gif

^不要被图形混淆 - 引导加载程序不在物理内存中......不知道他们为什么包含它......但除此之外它是准确的。

于 2013-01-18T21:39:50.520 回答
2

我想你在问为什么虚拟内存没有一直映射到 0x0。最大的原因之一是当你没有分配一个指针时它是非常明显的——如果它是 0x0,它指向“无”并且总是错误的。

当然,NULL 可以是任何值(因为它依赖于实现),但是由于未初始化的 int 的值是 0,在我看到的每个实现中,为了保持一致性,他们都选择保持 NULL 0。

还有很多其他原因,但这是一个很好的原因。是一篇关于虚拟寻址的 Wikipedia 文章。

于 2013-01-18T21:39:31.517 回答
1

系统保留了许多内存地址以帮助调试。

0x00000000 Returned by keyword "new" if memory allocation failed

0xCDCDCDCD Allocated in heap, but not initialized

0xDDDDDDDD Released heap memory.

0xFDFDFDFD "NoMansLand" fences automatically placed at boundary of heap memory. Should never be overwritten. If you do overwrite one, you're probably walking off the end of an array.

0xCCCCCCCC Allocated on stack, but not initialized

但是就像其他一些人指出的那样,操作系统使用的物理内存地址与操作系统分配给您的应用程序的逻辑内存地址之间存在区别。此处显示的示例图像。

于 2013-01-18T21:51:33.377 回答