代码之家  ›  专栏  ›  技术社区  ›  Nick Bolton

如何在C++中创建堆,而不是堆栈?

  •  12
  • Nick Bolton  · 技术社区  · 16 年前

    我有一个非常大的数组,它的长度必须是262144个元素(并且在将来可能要大得多)。我尝试在堆栈上这样分配数组:

    #define SIZE 262144
    int myArray[SIZE];
    

    但是,当我尝试添加超过某个点的元素时,当我尝试访问这些元素时,它们的值似乎是不同的。我理解这是因为堆栈上的内存量有限,而不是具有更多内存的堆。

    我没有太多运气就尝试了以下方法(不编译):

    #define SIZE 262144
    int *myArray[SIZE] = new int[SIZE];
    

    然后我考虑使用 malloc 但是我想知道是否有一种类似C++的方式来做这个…

    #define SIZE 262144
    int *myArray = (int*)malloc(sizeof(int) * SIZE);
    

    我应该一起去吗 马洛克 ?

    7 回复  |  直到 9 年前
        1
  •  43
  •   Matthew D. Scholefield    9 年前

    您将希望使用新的,如:

    int *myArray = new int[SIZE];
    

    我还会提到另一面,以防万一……

    由于您从堆栈转换到了堆,因此在处理完内存之后,还需要清理它。在堆栈上,内存将自动清理,但在堆栈上,您需要删除它,由于它是一个数组,因此您应该使用:

    delete [] myArray;
    
        2
  •  23
  •   Brian Neal    16 年前

    使用C++的方式更多的是使用向量。然后,您不必担心完成后删除内存;Vector会帮您完成这项工作。

    #include <vector>
    
    std::vector<int> v(262144);
    
        3
  •  1
  •   Johannes Schaub - litb    16 年前

    由于数字在编译时不一定是已知的,因此类型是指针:

    int *myArray = new int[262144];
    
        4
  •  1
  •   Mitch Wheat    16 年前

    new 在堆上分配。

    #define SIZE 262144
    int * myArray = new int[SIZE];
    
        5
  •  1
  •   John MacIntyre    16 年前

    我相信

    #define SIZE 262144
    int *myArray[SIZE] = new int[262144];
    

    应该是

    #define SIZE 262144
    int *myArray = new int[262144];
    

    还是更好

    #define SIZE 262144
    int *myArray = new int[SIZE];
    
        6
  •  0
  •   Tommy Hui    16 年前

    第一次尝试失败的原因是语法不正确。试试这个:

    int *myArray = new int[SIZE];
    
        7
  •  0
  •   Wilka    16 年前

    使用的语法 new 是错的,应该是:

    int *myArray = new int[262144];
    

    你只需要把尺寸写在作业的右边。

    但是,如果您使用C++,您可能希望使用 std::vector (你会有)或类似的东西 boost::scoped_array 使内存管理更加容易。