Как создать массив в 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];

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

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

Я считаю

#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 чтобы сделать управление памятью немного проще.