Как создать массив в C++, который находится в куче вместо стека?
у меня очень большой массив, который должен быть 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 ответов
вы захотите использовать new как таковой:
int *myArray = new int[SIZE];
Я также упомяну другую сторону, на всякий случай....
поскольку вы переходите из стека в кучу, вам также нужно будет очистить эту память, когда вы закончите с ней. В стеке память будет автоматически очищаться, но в куче вам нужно будет удалить ее, а так как это массив, вы должны использовать:
delete [] myArray;
более C++ способ сделать это-использовать вектор. Тогда вам не нужно беспокоиться об удалении памяти, когда вы закончите; вектор сделает это за вас.
#include <vector>
std::vector<int> v(262144);
поскольку число не обязательно известно во время компиляции, тип является указателем:
int *myArray = new int[262144];
Я считаю
#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];
причина, по которой первая попытка не сработала, заключается в том, что синтаксис неверен. Попробуйте это:
int *myArray = new int[SIZE];
ваш синтаксис для использования new
ошибся, должно быть:
int *myArray = new int[262144];
вам нужно только поставить размер справа от задания.
однако, если вы используете C++ , вы можете посмотреть на использование std::vector
(который у вас будет) или что-то вроде boost::scoped_array
чтобы сделать управление памятью немного проще.