使用Java创建悬空指针

如何使用Java创建悬空指针?

根据以下维基百科的定义 , 没有

计算机编程中的悬空指针和野指针是指向不指向适当类型的有效对象的指针。

删除或取消分配对象时会出现悬空指针,而不修改指针的值 ,以便指针仍然指向释放的内存的内存位置

如果您愿意,则无​​法删除(或“垃圾收集”)某个引用仍然指向的对象(1)

在上面的维基百科文章中你可以读到:

在像Java这样的语言中, 悬挂指针不会发生,因为没有明确释放内存的机制。 相反,垃圾收集器可以释放内存,但仅当对象不再可以从任何引用访问时。

使引用指向(“有效”)对象的唯一方法是为其分配null。

(1)除非它是例如WeakReference,否则引用在垃圾收集时无效。

您无法在java中创建悬空指针,因为没有显式释放内存的机制

 String foo = null; 

那么如果你试着说foo.substring(0) ,你会得到一个NullPointerException

你是这个意思吗?

并非在所有JVM上都可用,但Sun的JVM确实为您提供了sun.misc.unsafe#allocateMemory(long bytes) 。 该调用返回一个指针。

sun.misc.unsafe#freeMemory(long address )释放内存。 你的初始指针现在是“悬空”。

这取决于你对悬空指针的定义。

如果你采用维基百科定义的悬空指针,那么不,你不能用Java。 由于语言是垃圾收集的,因此引用将始终指向有效对象,除非您向引用显式指定“null”。

但是,您可以考虑使用悬垂指针的更多语义版本。 如果你愿意,可以使用“语义悬空参考”。 使用此定义,您可以引用物理上有效的对象,但在语义上该对象不再有效。

 String source = "my string"; String copy = source; if (true == true) { // Invalidate the data, because why not source = null; // We forgot to set 'copy' to null! } // Only print data if it hasn't been invalidated if (copy) { System.out.println("Result: " + copy) } 

在这个例子中,’copy’是一个物理上有效的对象引用,但在语义上它是一个悬空引用,因为我们想将它设置为null,但是忘了。 结果是使用’copy’变量的代码将执行而没有任何问题,即使我们打算使其无效。