在C ++中是否有办法检查任何指针是否引用了内存地址?
答案 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的扫描(这应该是非常罕见的......)。然而,这需要一个更详细的问题。