什么是 C++ 中的可追踪指针?

a l*_*ner 13 c++ c++11

试图理解 ISO 标准 c++ 中的第 20 条:

更改:对垃圾收集区域的支持最少。

基本原理:新功能需要。

对原始特性的影响:有效的 C++ 2003 代码,在没有可追踪指针支持的情况下编译,使用声明可达的区域与较新的 C++ 代码交互可能具有不同的运行时行为。

https://timsong-cpp.github.io/cppwp/n4618/diff.cpp03.utilities

什么是可追踪指针(不是可追踪指针对象)?可追踪指针和普通指针有什么区别?

Die*_*ühl 8

似乎没有术语可追踪指针的定义C++ 标准中。也就是说,它几乎肯定是指一个可追踪的指针对象。您可以提出缺陷以纠正问题,即修改措辞以定义可追踪指针或引用可追踪指针对象。由于附件 C 对标准没有强制影响,我猜它会在编辑上得到修复。垃圾收集支持也是一个不太流行的部分,因为人们喜欢玩弄指针的技巧,例如,使用未使用的位来存储信息。

从语义上讲,可跟踪对象指针是最小垃圾收集支持所需要的。关键思想是指针值不能被“隐藏”,即修改它们的位模式,并且可以通过垃圾收集来识别,并且可能会收集未以这种方式引用的对象。例如,定义限制了双向链表实现的可移植性,它使用一个指针来存储指向前一个和下一个节点的 XOR 指针,其遍历取决于知道您来自的节点和当前节点移动到下一个节点:异或值不是安全派生的指针. 同样,我认为设置由于对齐约束或因为指针中只有一些位用于地址(例如,64 位指针值中的 48 位)而已知为零的位不一定是可移植的。

第 20 节中的函数用于声明额外的“根”对象,因此垃圾收集器不会重用以某种方式被认为处于活动状态的对象的内存,尽管 C++ 实现本身不知道如何到达它们。例如,您可以在将指针的值存储到文件中之前将指针声明为可访问的,然后再次读取该文件以恢复其位置。

当然,C++ 没有强制垃圾收集。但是,存在用于 C++ 的自定义垃圾收集器。即使在编写不需要垃圾收集器的程序中,垃圾收集器对于定位内存泄漏也很有趣。