Как мне создать массив в C ++, который находится в куче, а не в стеке? - PullRequest
12 голосов
/ 24 марта 2009

У меня очень большой массив, который должен быть длиной 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);

Должен ли я просто пойти с malloc?

Ответы [ 7 ]

45 голосов
/ 24 марта 2009

Вы захотите использовать новый, например, такой:

int *myArray = new int[SIZE];

Я также упомяну другую сторону этого, на всякий случай ....

Поскольку вы переходите из стека в кучу, вам также нужно будет очистить эту память, когда закончите с ней. В стеке память будет автоматически очищаться, но в куче вам нужно будет удалить ее, и, поскольку она является массивом, вы должны использовать:

delete [] myArray;
23 голосов
/ 24 марта 2009

Более эффективный способ C ++ - использовать вектор. Тогда вам не нужно беспокоиться об удалении памяти, когда вы закончите; Вектор сделает это за вас.

#include <vector>

std::vector<int> v(262144);
1 голос
/ 24 марта 2009

Я верю

#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];
1 голос
/ 24 марта 2009

new выделяет в куче.

#define SIZE 262144
int * myArray = new int[SIZE];
1 голос
/ 24 марта 2009

Поскольку число не обязательно известно во время компиляции, тип является указателем:

int *myArray = new int[262144];
0 голосов
/ 24 марта 2009

Ваш синтаксис для использования new был неправильным, он должен быть:

int *myArray = new int[262144];

Вам нужно только указать размер справа от задания.

Однако, если вы используете C ++, вы можете захотеть использовать std::vector (который у вас будет) или что-то вроде boost::scoped_array для заполнения управление немного проще.

0 голосов
/ 24 марта 2009

Причина, по которой первая попытка не сработала, заключается в неправильном синтаксисе. Попробуйте это:

int *myArray = new int[SIZE];
...