【问题标题】:What is the difference between 'int [] arr1=null;' and 'int [] arr1=int [5];' regarding memory allocation [closed]'int [] arr1=null;' 有什么区别?和'int [] arr1 = int [5];'关于内存分配[关闭]
【发布时间】:2013-06-19 08:00:49
【问题描述】:

我想知道有什么区别

int []  arr1=null;

int [] arr1=int [5];

关于内存分配?我在某处读到 null 是一个引用变量,因此堆中有一个内存分配,但我假设 int[] 也是一个引用变量,不是吗?所以还是有区别的?

一般而言,我可以在 Java/C++ 中的哪些分配示例中看到堆内存和堆栈内存分配之间的区别?

【问题讨论】:

  • 变量声明的上下文是什么——是局部变量、实例变量还是静态变量?此外,可能只值得询问无论是 C++ 还是 Java。
  • 你的问题在 C++ 中没有意义。
  • 我建议我们去掉c++标签。
  • 这甚至不是有效的 Java,是吗?

标签: java c++ c memory memory-management


【解决方案1】:

您提问的原因如下图所示

在 JAVA 中

int [] arr1=int [5];在java中无效

【讨论】:

  • c++ 在堆中根本不起作用?
  • 我不能说不,因为在 c++ 中你可以创建那种环境......正如你所知,java 中的堆内存是由 c malloc 组成的......还有看这篇文章javamex.com/java_equivalents/memory_management.shtml
  • 这样我们就可以使用 C 编程来创建堆
  • 是的,因为 c 具有动态内存分配功能
  • @NidhishKrishnan 先生....所以如果 c 可以做到,那么 c++ 也可以做到......所以具有类似于 java 的所有功能,我们可以说 c++ 比 java 更好
【解决方案2】:

线

int[]  arr1=null;

只创建变量arr1,它是对数组的引用。引用是null,所以只分配了引用本身。它猜它大约是4个字节。

然而

int[] arr1= new int[5];

额外分配一个包含 5 个整数的数组,即额外的 4*5 字节。总共4 + 4*5 = 24 个字节。

【讨论】:

    【解决方案3】:

    在 C++ 中此语法无效,但请将其更改为:

    int * arr1=nullptr;
    
    int * arr2=new int [5];
    

    它基本上做同样的事情:

    在我的示例中,arr1 是指向某些内存的引用/指针,当前不引用/指向任何内容。

    arr2 引用/指向一个由 5 个整数组成的数组,这些整数在堆上分配。

    如果在稍后的某个阶段,我们需要让arr1 指向十个整数,我们可以(同样,在 C++ 中)这样做:

    arr1 = new int[10];
    

    在 C++ 中,您还必须 delete 值:

    delete [] arr2; 
    
    delete [] arr1; 
    

    请注意,删除指向 null 的内容是有效的,但删除未初始化的指针是无效的。

    【讨论】:

      【解决方案4】:

      不同之处在于第二个版本分配了一个五元素int 数组,而第一个没有。

      还为 arr1 引用本身预留了内存,但这在两种情况下都是一样的。

      【讨论】:

        【解决方案5】:

        null 是 Java 的一种说法,即它没有分配任何堆或不指向任何东西。在第二个版本中,java 在堆上分配 5 个整数的数组,并让您的变量 arr1(顺便说一句在堆栈上)指向它。

        【讨论】:

          【解决方案6】:

          在 Java 中,

          int [] arr1=int [5];
          

          它同时创建数组对象(因为在 java 中,数组被视为对象)和内存空间用于5 原始(int)元素。并将每个原始元素初始化为默认值(0 for int)。最后将该对象的引用提供给引用变量arr1

          int []  arr1=null;
          

          只创建一个引用变量arr1,它没有指向任何东西。此行指定arr1 将来可能包含对象的引用,该对象将包含原始整数数组。

          【讨论】:

          • +1:很好的解释。
          【解决方案7】:

          只是在谈论java。

          int[] 的类型没有任何 int 实例。它是 int 数组的指针。所以它可以指向int数组的实例。

          public class Foo {
              public static void main(String[] args) {
                  int[] a, b, c;
          
                  a = new int[] {1,2,3,4,5};
                  b = new int[] {1,2,3,4,5,6};
                  c = a;
                  System.out.println(c.length);
                  c = b;
                  System.out.println(c.length);
              }
          }
          

          a, b 是 int 数组的指向实例。在上面的最后一行代码中,c 和 b 指向同一个实例。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-01-23
            • 2019-08-14
            • 1970-01-01
            • 2016-05-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-11-05
            相关资源
            最近更新 更多