使用Java创建悬空指针

时间:2011-02-12 06:19:05

标签: java

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

5 个答案:

答案 0 :(得分:14)

根据下面的Wikipedias definition

  

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

     

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

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

在上面的维基百科文章中,您确实可以阅读:

  

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

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

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

答案 1 :(得分:3)

你不能在java中创建悬空指针,因为没有明确释放内存的机制

答案 2 :(得分:1)

String foo = null;

然后,如果您尝试说foo.substring(0),您将获得NullPointerException

这是你的意思吗?

答案 3 :(得分:0)

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

sun.misc.unsafe#freeMemory(long address)释放了那段记忆。你的初始指针现在是“晃来晃去”。

答案 4 :(得分:0)

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

如果你把维基百科定义为悬挂指针,那么不,你不能用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'的代码变量将毫无问题地执行,即使我们想要使它无效。