C ++:检查是否正在引用地址

时间:2012-03-06 06:43:58

标签: c++ pointers

在C ++中是否有办法检查任何指针是否引用了内存地址?

5 个答案:

答案 0 :(得分:8)

不,完全没有。

(除非你自己做了跟踪。)

答案 1 :(得分:2)

这意味着C ++有一个垃圾收集器或等价物,但事实并非如此。换句话说,没有。

您可以利用智能(尤其是此用例共享)指针来管理您的记忆。

答案 2 :(得分:1)

这是不可能的。想想指针算术:从给定的记忆位置,你可以增加你的方式,到达不同的位置。这用于在数组之间移动:from

int * a = &array[0];

没有人知道你是否会做++ a,a + 3或其他什么。你可以从array [0]开始,超出数组的范围(实际上是:-))。

这在C和C ++中根深蒂固地继承了它,但是C ++开发了一系列惯用的样式,试图将原始指针级别的需求降到最低。您可以阅读有关智能指针的信息(它会记录谁指的是给定资源,并在计数变为零时将其删除)。在许多情况下,您可以使用std :: vector代替数组,它可以为您提供许多好处,而无需担心超出数组末尾一步的风险。

答案 3 :(得分:0)

在执行此操作之前,您需要实现自己的智能指针,动态内存分配或垃圾收集器。

答案 4 :(得分:0)

没有。并不是的。但...


Boehm Garbage Collector非常成功地设法通过悲观来实现这一点,即考虑到任何看起来像内存地址的内容是一个内存地址(而不是随机整数或连续的恰好看起来如此的位域)。悲观意味着收集一些数据的时间要晚得多,但这对于垃圾收集器来说并不太重要(并且比收集太快要好得多!)。


在C ++ 11中,引入了许多low-level facilities来简化垃圾收集器的创建:

  • declare_reachable:声明对象无法回收

  • undeclare_reachable:声明对象可以回收

  • declare_no_pointers:声明内存区域不包含可跟踪指针

  • undeclare_no_pointers:取消std::declare_no_pointers的效果

  • pointer_safety:列出指针安全模型

  • get_pointer_safety:返回当前指针安全模型

declare_no_pointers提示对象只包含整数/位域/无论什么,没有指针,因此扫描垃圾收集器时可能更准确。在您的案例中可以利用这些知识。


但是,所有这一切都是打包技巧的牺牲品。例如,通常利用64位指针具有太多位的事实并使用它们中的一些来在指针内存储标志。或者相反,利用double NaN有效负载来存储指针或整数值。显然,这对于扫描内存寻找指针并不合适,因为扫描的值与实际地址不对应。

例如,这些技巧大量用于Clang / LLVM或Javascript引擎(V8,SpiderMonkey等),通常用于真正关心内存占用和速度的软件中。


所以,一般来说,没有C和C ++太松散与内存准确地知道这一点。即使std::shared_ptr只是约定,也可能会意外地将 raw 指针存储在其他地方。

在实践中,您可能会遇到大多数问题的解决方案。使用类型系统和一些约定或使用Boehm的扫描(这应该是非常罕见的......)。然而,这需要一个更详细的问题。