【问题标题】:Which object is created in which part of memory?哪个对象是在内存的哪个部分创建的?
【发布时间】:2010-11-27 21:02:15
【问题描述】:
public class Order
{
    static Customer cust = new Customer();
    string sEmpty = "";

    public static void main(String args[])
    {
        int iTotal = 10;
        string sProductName = "Salt";
        Ship shp = new Ship();
    }
}

在上面的代码中,在内存的哪个部分创建了哪个对象和引用? (我的意思是堆和栈)


(来源:c-sharpcorner.com

【问题讨论】:

  • 你不应该做自己的功课吗?
  • 不,因为我不是学生 :)
  • 然后问一个看起来 100% 不像家庭作业的问题......
  • 此链接可能有帮助:tinyurl.com/qs6mzj
  • 哇,您加载的图片直接来自这篇文章 (c-sharpcorner.com/UploadFile/rmcochran/…),它非常清楚地解释了您的要求。加上我在下面给出的链接应该足以让你继续......

标签: java c# heap-memory stack-memory


【解决方案1】:

由于您标记了您的问题 Java,我假设您的意思是 Java。直接从马嘴里:

Java 虚拟机有一个在所有 Java 之间共享的堆 虚拟机线程。堆是 运行时数据区,从中 所有类实例的内存和 数组已分配。

JVM Spec

这是一个link 对先前的 SO 问题进行了认真详细的讨论(并且是关于该主题的与语言无关的讨论)。

这里是 link,来自 C# 角的一篇文章,详细介绍了 C# 中的问题。

【讨论】:

  • @uzay95 总之,不。 C# 角链接中的这句话应该可以帮助您:“堆栈或多或少负责跟踪我们代码中正在执行的内容(或“调用”的内容)。堆或多或少负责跟踪我们的对象(我们的数据,嗯......大部分 - 我们稍后会谈到。)。”
  • 从 1.6 开始,从 实现 的角度来看,这不再适用于所有情况。对于某些对象(如字符串文字)来说,这从来都不是完全正确的。
【解决方案2】:

Order 和 Customer 在堆上。尽管 Customer 可能是一个结构,但它是一个引用类型(例如,一个类)的组合成员。

所有字符串都是引用类型,都是在堆上创建的。

我不确定 Ship 类,因为我没有它的声明(即,我不知道它是结构还是类)。

int iTotal 变量在堆栈上创建。

C# 也是如此。 Java 可能有不同的规则。

【讨论】:

  • 大卫,“客户可能是一个结构,它是一个引用类型的组合成员”是什么意思?
  • 客户可能已被声明为 struct Customer {}。 struct 使 Customer 成为一个值类型,并且在正常情况下将被放置在堆栈上。但是,由于 Customer 是 Order 类的成员,Order 是放置在堆上的引用类型,因此 Customer 也放置在堆上。
  • 啊!谢谢你的解释!
  • 在 C#/Java 的所有这类问题中,我总是错过一些信息。虽然真实对象(实例)在堆中,但指向它们的引用(占用实际内存)是堆栈分配的:sProductName 是堆栈分配的对堆分配字符串的引用......然后,语言再次尝试隐藏引用和对象不一样的事实......不幸的是。
  • @dribeas...然后是拳击。
猜你喜欢
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
相关资源
最近更新 更多