什么架构计算无效指针不安全?

Bja*_*une 9 c++ cpu-architecture

int* a = new int[5] - 1;
Run Code Online (Sandbox Code Playgroud)

这一行本身根据C++标准调用未定义的行为,因为a是一个无效的指针而不是一个接一个的结尾.同时,这是制作基于1的数组(第一个元素是[1])的零开销方式,我需要用于我的项目.

我想知道这是否是我需要避免的,或者如果C++标准只是保守地支持一些奇怪的架构,我的代码永远都不会运行.所以问题是,这将是一个什么样的架构问题?这些广泛存在吗?

编辑:要查看上面的行确实调用了未定义的行为,请查看此问题.

编辑:Dennis Zickefoose指出,当调用未定义的行为时,允许编译器执行任何操作,因此编译器和CPU都必须提供超出C++标准的保证,以便像这样的代码工作.我正在将问题扩展到现代C++编译器是否存在这个问题.

Kon*_*lph 5

无论哪种方式,创建基于单一的数组的定义明确,零开销的方法如下:

int* a = new int[6];
Run Code Online (Sandbox Code Playgroud)

那里,问题解决了.;-)(但仍然有趣的问题.)

  • 零开销?我想不是.你分配的**内存比实际需要多**. (2认同)

Bo *_*son 4

用于执行检查的硬件存在于所有 x86 处理器中,只是目前我们没有在最流行的操作系统中使用它。

如果您使用分段内存架构(我们为 16 位系统所做的),则分配不太可能返回地址segment:0。在这种情况下,您无法从该地址中减去任何内容!

这是阅读分段内存以及为什么无法加载无效段的起点:

http://en.wikipedia.org/wiki/Segment_descriptor

您必须决定您的代码是否不太可能发生这种情况,或者您是否可以定义一个重载operator[]来为您处理偏移量。