【问题标题】:management of the objects对象管理
【发布时间】:2013-03-04 07:57:57
【问题描述】:

我对使用 java 或 c++ 管理对象有疑问。

情况是,在 C++ 中,当您想要创建一个动态对象时,它比创建它的块范围内的生存时间更长,您必须执行一个 new 并且您将收到一个指针。否则,如果你只是想在块范围内使用这个对象,你不需要使用 new... 来创建它。

但在 Java 中,您总是必须使用 new 创建它们,因为如果不是,则该对象为 null,您可以使用它。

这是为什么呢?只是它的工作原理吗?

谢谢

【问题讨论】:

  • 为什么?因为 Java 和 C++ 是两种不同的语言,具有完全不同的对象模型和不同的规则。 (两者恰好都有一个关键字new,含义不同。)

标签: java c++ pointers


【解决方案1】:

基本上,这就是它的工作原理。一旦使用了新关键字,就会创建对象并将其弹出到堆上。如果您没有在方法之外引用该对象,那么垃圾收集器将自动回收该对象。 我建议您阅读 Java 堆和垃圾收集的基础知识,以便更好地理解。那里有很多资源。我总是向新来的人推荐头部第一本书。

【讨论】:

  • 在我看来,OP 了解它在 C++ 中的工作原理,但不了解 Java 中“新”的意义。
  • 啊,我把它弄反了...重读他的帖子,我不再确定哪种方式...
  • 是的,问题不是很清楚。我是一个 Java 人,所以解决了这一点! :D
【解决方案2】:

这种差异是因为 Java 使用垃圾收集器进行内存管理。由于垃圾收集器会在对象范围结束时自动释放对象(并且它没有可访问的引用),因此无需使用两种不同的方法来创建对象。

你可以说 Java 中的对象自动表现得像 C++ 中的对象,它们在没有 new 的情况下初始化,因为你不必考虑删除它们。

【讨论】:

    【解决方案3】:

    我能想到的最好的类比是,C++ 中的所有类型的行为有点类似于 Java 中的原语。如果您在 Java 中声明一个原语,则不必使用new,您可以立即使用该变量。但是这样一个原语,就像 C++ 中的大多数对象一样,只能在当前范围内存活。在 C++ 中,如果您希望一个对象存在于当前范围之外,您需要将这一点告诉您的编译器,因为它必须在堆而不是堆栈上分配内存。您可以使用new 来执行此操作。在 Java 中,所有对象(保存原语)都分配在堆上,堆栈上的唯一数据是对堆内存的引用和原语。因此,在 Java 中,所有内存分配都是使用 new 完成的。

    以上是Java中实际内存管理的简化。有关原语的堆栈/堆内存的更全面讨论,请查看here

    【讨论】:

    • heap 与 stack/primitives vs. objects 有一个很好的解释;上面有点简化。 stackoverflow.com/questions/3646632/…
    • 嗯,这就是我用“somewhat”暗示的。 ;) 但是感谢您的链接,我会将其包含在答案中。
    【解决方案4】:

    在 C++ 中,任何东西都可以在堆栈上分配(当你说

    ObjectType o;
    

    在 C++ 中。

    在 Java 中,只有原语真正分配在堆栈上。对象永远不会在堆栈上(就是这样)。当你说

    ObjectType o;
    

    在 Java 中,没有分配对象,只有一个“变量”。一个变量可以引用一个对象,但目前它没有。本质上和说是一回事

    ObjectType *o = NULL
    

    在 C++ 中。

    为了真正为这个引用分配一个对象来引用,你必须在Java中使用new

    【讨论】:

      【解决方案5】:

      情况是,在 C++ 中,当您想要创建一个动态对象时,该对象的生存时间超过创建它的块范围,您必须执行一个 new 并且您将收到一个指针。

      C++ 中的 new 运算符在 heap 上分配空间。堆是主内存的较大部分所在的位置。如果您这样做,您有责任在使用 free 运算符完成该空间后释放该空间。

      否则,如果你只是想在块范围内使用这个对象,你不需要使用new来创建它...

      当您在 C++ 中声明变量时,内存分配在 堆栈 上。堆栈是存储本地数据的地方,当函数返回时,您在执行函数时推送(添加)到其上的所有内容都将自动弹出(删除)。栈通常比堆小很多,但使用它有一些好处:你不需要担心内存管理,它更快等等。

      但在 Java 中,您总是必须使用 new 创建它们,因为如果不是,则该对象为 null,您可以使用它。

      当您在 Java 中声明变量时,它们会再次存储在堆栈中 如您所知,您不会对原始数据类型(例如 int i = new int(3);)调用 new。当您执行Object x; 之类的操作时,您声明x 将是Object 类型对象的引用。但是,您没有为其分配值,因此引用是 null(不是对象,因为没有对象)。

      Java 中的 new 操作符,粗略地说,在堆上分配空间,调用它所调用对象的构造函数,并返回对构造对象的引用。与 C++ 的不同之处在于您不需要自己释放对象 - 有一个 垃圾收集器。本质上,它的作用是监控有多少引用指向一个对象,如果它们降为零,它会自动删除该对象。

      所以当你这样做时

      对象 y = new Object();
      x = y;
      你会得到两个指向同一个对象的引用(x 和 y)。当你有这样的函数调用时
      Object foo() {
          对象 y = 新对象();
          返回 y;
      }
      
      

      空栏(){ 对象 x = foo(); ... }

      bar()... 部分中,您将拥有引用x,指向在foo() 中创建的对象。由于foo 已返回,y 引用已被释放,因此在程序的... 部分中将只有一个对该对象的引用。如果您没有在bar 中的任何位置复制x 引用并且bar 返回,那么对该对象的引用将是0,并且垃圾收集器将收集它(尽管不是立即)。

      -斯坦

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-24
        • 1970-01-01
        • 2016-02-01
        • 1970-01-01
        • 2015-09-27
        • 2010-10-31
        • 2012-04-07
        相关资源
        最近更新 更多