【问题标题】:How is initializing an array different from mallocing memory?初始化数组与分配内存有何不同?
【发布时间】:2012-12-31 06:36:30
【问题描述】:

我是 C++ 新手。我无法区分初始化数组和分配内存。在我看来,它们似乎实现了相同的目的。

具体来说,我可以通过int myArray[] = {1, 2, 3}; 初始化一个数组。我还可以使用malloc 来获取内存并将其分配给一个空指针。后来,我释放了这块内存。

这两种方法有什么区别?计算机是否将数据存储在相同的位置并以相同的方式?

【问题讨论】:

    标签: arrays memory-management c++


    【解决方案1】:

    在 C++ 中,您可以通过两种不同的方式分配内存。第一种方式在栈上分配内存。

    int arr[] = {1,2,3};
    int arr[3];
    

    这两行代码都在堆栈上创建了一个大小为 3 的数组。唯一的区别是第一行还初始化了数组中的值。

    第二种分配内存的方式是在堆上。堆上可用的内存量通常比堆栈上的可用内存量大得多。 newmalloc 操作在堆上分配内存。

    int* arr = (int*) malloc(100*sizeof(int));
    int* arr = new int[100];
    

    这两行代码都在堆上创建了一个大小为 100 的数组。现在这是两者之间的区别。在 C++ 中,您应该始终使用 new,因为它可以确保调用数组中每个元素的构造函数。它的类型安全性也更高,不像 malloc,它根本不是类型安全的,因为它只是将 void* 返回到可以任意解释的字节块中。

    现在,如果您正在动态分配内存,这意味着您直到运行时才知道数组的大小,您应该始终使用 new/malloc 在堆上分配它。

    最后要注意的是如何释放内存,使用delete/free

    free(arr); //arr was allocated with malloc
    delete[] arr; //arr was allocated with new
    

    如果您使用new 分配内存,则必须使用delete 释放它。您不能将new/mallocdelete/free 混合搭配。最后delete[] 释放了一个对象数组。如果您只分配了一个对象,那么您只需使用delete

    Object* myobj = new Object;
    delete myobj;
    

    【讨论】:

      【解决方案2】:

      在我看来,这个问题不属于这里。但我会回答的。你可以这样做:

       int* myArray = (int *) malloc(3 * sizeof(int));
      

      这意味着您正在创建内存大小为 3 * sizeof(int) [即C] 中整数数据类型的大小,并且您将返回一个指向此内存位置的 int 指针。 [IE。一个指向它开头的指针,如果它包含整数则处理它]。这些内存槽被转换为 int *(使用 (int *)),并称为 myArray。 myArray 是一个 int 数组(和一个 int 指针)。因为数组实际上是 C 中的指针。那么你可以这样做:

       for (int i = 0; i < 3; i++) 
           myArray[i] = i + 1;
      

      malloc 中可能存在一些问题。因此,在初始化后总是检查 myArray == NULL。如果是这种情况,请修复错误,并且不要使用 $\{1,2,3\}$ 初始化数组。否则,您将遇到分段错误。

      我希望我不会对你含糊其辞。但由于您使用的是 C++,我建议您改用 new 运算符。你会这样做:

       int myArray[] = new int[3]; 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-01
        • 2017-11-25
        • 2018-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-03
        • 2022-09-27
        相关资源
        最近更新 更多