Java中的C ++智能指针是否还有什么?
答案 0 :(得分:13)
所有Java的“指针”(参考)都是智能指针。
Java在托管环境中运行。这意味着Java使用垃圾收集器来清理不再被引用的变量。
Java的引用虽然与指针略有不同。 Java抽象出你在C ++中看到的所有指针值和数学。因此,无论何时创建新对象并将其存储到变量,您都将其存储到Java的“智能指针”版本中。
答案 1 :(得分:7)
我在内存管理方面只听说过智能指针。由于内存管理是Java平台的核心,显然没有必要这样做。
我们想到的最接近的匹配是java.lang.ref.WeakReference和java.lang.ref.SoftReference,因为它们允许在某种程度上自定义垃圾收集。
答案 2 :(得分:6)
是和否。不,在Java中不存在像指针对象那样的东西。是的,因为每个物体都是一个“智能指针”,这意味着它可以进行垃圾收集,并可以照顾自己的生命。
答案 3 :(得分:3)
不,Java中没有任何类的指针。一般情况下,您不需要智能指针因为您已经有一个垃圾收集器来执行引用计数以自动管理内存分配/释放周期。
答案 4 :(得分:0)
如果您正在寻找确定性销毁或引用计数,这可以使您及时控制对象生命周期,以有效利用资源(垃圾内容不会 给你),那么Java提供了两件事。
1)(在Java上广泛使用)最常见的解决方案是Closeable
/ AutoCloseable
模式。这是一个简单的模式。每个需要确定性销毁的对象都有一个所有者,该所有者负责调用close
。 (对象可能有多个用户,但只有一个所有者。)用于文件句柄,网络套接字等。
2)引用计数是一个更为罕见的选项,其中一个对象可以具有多个所有者(通常,用户和所有者之间没有明显的区别)。这就是C ++ shared_ptr
实现的。看一下almson-refcount,这是我写的实现引用计数的库。
为了澄清,在处理不是内存的任何类型的资源时,在Java中必须进行确定性销毁。垃圾收集器通过其惰性方法有效地管理内存。但是,您不能依靠垃圾收集器来管理任何其他资源。这就是finalize
在Java 9中已过时的原因。