使用Java创建悬空指针

使用Java创建悬空指针,java,Java,如何使用Java创建悬空指针 String foo = null; 然后,如果您尝试说foo.substring(0),您将得到一个 这就是你的意思吗?根据下面的说明,没有 计算机编程中的悬空指针和通配符是指不指向适当类型的有效对象的指针 删除或解除分配对象时会出现悬空指针,而不修改指针的值,因此指针仍然指向解除分配内存的内存位置 没有办法删除(或“垃圾收集”,如果您愿意)某个引用仍然指向(1)的对象 在上面的维基百科文章中,您可以进一步阅读: 在Java之类的语言中,挂起指针不能出现,因为没

如何使用Java创建悬空指针

String foo = null;
然后,如果您尝试说
foo.substring(0)
,您将得到一个

这就是你的意思吗?

根据下面的说明,没有

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

删除或解除分配对象时会出现悬空指针,而不修改指针的值,因此指针仍然指向解除分配内存的内存位置

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

在上面的维基百科文章中,您可以进一步阅读:

在Java之类的语言中,挂起指针不能出现,因为没有显式释放内存的机制。相反,垃圾收集器可能会释放内存,但仅当对象不再可以从任何引用访问时

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


(1) 除非它是一个WeakReference,但是引用在垃圾收集时无效。

您不能在java中创建悬空指针,因为没有任何机制可以显式释放内存并非在所有JVM上都可用,但Sun的JVM确实为您提供了
Sun.misc.unsafe#allocateMemory(长字节)
。该调用返回一个指针


sun.misc.unsafe#freemory(长地址
)释放该内存。您的初始指针现在是“悬空的”。

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

如果你接受维基百科对悬空指针的定义,那么不,你不能在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”变量的代码将毫无问题地执行,即使我们打算使其无效。

您是从wikipedia复制的吗?;-)我也会调用悬空的未初始化指针,但同样,您也不能在Java中创建未初始化指针。@Sergey:局部变量可以未初始化,但它们不可用。@Paŭlo,对。不过,我怀疑它们是否可以被称为悬挂指针。@Ignacio,这太棒了,你应该把它作为一个答案发布。我可以不使用JNI,只使用
ProcessBuilder
,但与JNI一样,你并没有真正使用Java:-)