有效指针的含义
Posted
技术标签:
【中文标题】有效指针的含义【英文标题】:Meaning of valid pointer 【发布时间】:2014-06-25 00:30:56 【问题描述】:在this 的答案中,我偶然发现了关于“有效指针”含义的讨论。因为我认为总的来说这很有趣:
什么是 C++ 中的“有效指针”?
特别是:
reinterpret_cast<const void*>(0x1)
是一个有效的指针吗?
【问题讨论】:
如果您在考虑编译时常量传播的情况下重新阅读另一篇文章可能会有所帮助,这是constexpr
旨在解决的大问题之一。
【参考方案1】:
标准将实现分为两大类:
具有严格指针安全性的那些 指针安全性宽松的那些你的表达式肯定不是一个安全派生的指针,所以它一开始是无效的。
引自 3.7.4.3:
实现可能具有宽松的指针安全性,在这种情况下,指针值的有效性不取决于它是否是安全派生的指针值。或者,实现可能具有严格的指针安全,在这种情况下,引用具有动态存储持续时间的对象的指针值不是安全派生的指针值是无效的指针值,除非引用的完整对象之前已被宣布为可达(20.7.4)。 [ 注意:使用无效指针值(包括将其传递给释放函数)的影响是未定义的,请参见 3.7.4.2。即使不安全派生的指针值可能与某些安全派生的指针值比较,也是如此。 — 尾注] 实现定义了实现是否具有宽松的或严格的指针安全性。
对于具有宽松安全性的实现,指针值如何获取并不重要,只是(3.9.2):
对象指针类型的有效值表示内存中字节的地址 (1.7) 或空指针。
0x1
是您系统上的有效内存地址吗?好吧,对于某些嵌入式系统来说确实如此。对于大多数使用虚拟内存的操作系统,从零开始的页面被保留为无效。
【讨论】:
我不确定这是否是正确的参考。我认为“指针安全”的东西是关于不透明地支持垃圾收集。我关于有效指针的观点是各种“表达式”规则的结果,例如您可以添加、减去和取消引用的内容。 @KerrekSB:指针值可以是有效的,但如果以某些方式使用仍会导致未定义的行为(例如:将自动变量的地址传递给::operator delete()
)
关于您的编辑:这有点令人困惑,因为问题涉及constexpr
指针,而constexpr
明确禁止具有未定义行为的表达式(例如,越界数组访问)。因此,虽然您可以使用平台定义、重新解释的地址,但不允许将其作为常量表达式......(尽管我想我们知道这一点)。
@KerrekSB:什么未定义的行为?它已正确对齐,并且尚未取消引用。
它不是一个合法的常量表达式,因为使用了reinterpret_cast
,而不是因为任何未定义的行为。以上是关于有效指针的含义的主要内容,如果未能解决你的问题,请参考以下文章