Распределение размера с помощью нового оператора

У меня есть два сомнения по поводу нового оператора

1.)

int a[20];

Приведенный выше оператор выделяет память размером 20 в массиве

int a=new int[20];

это утверждение также делает то же самое, тогда почему я должен идти с оператором new, когда так легко распределить размер по массиву

2.)
почему оператор new всегда используется для выделения размера только указательным переменным, таким как

   int *p;
    p=new int[100];

он не используется для выделения размера обычным переменным

4 ответа

int a[20];

Распределяет в стеке, размер должен быть известен во время компиляции.

int * a = new int [20];

Распределяет в куче, размер не должен быть известен во время компиляции, может быть указан во время выполнения.

int a[20];

выделяет память в стеке.

int *a=new int[20];

выделяет память на куче.

Преимущество кучи над стеком:-

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

Недостаток кучи над стеком:-

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

new[20] создает "динамическую" память (в куче). [20] создает память в стеке.

с новым вы можете сделать что-то вроде этого:

std::vector<int*> my_std_vector;

for(int i=0; i < atoi(argv[1]); ++i) {
  int *my_int = new int[20];
  my_std_vector.push_back(my_int);
}

некоторые примеры: http://www.cplusplus.com/reference/new/operator%20new%5B%5D/

Есть некоторые проблемы с использованием определений массивов, подобных этому.

int a[20];

Этот оператор выделяет массив либо в статической памяти, либо в стеке, в зависимости от контекста, в котором используется оператор. Обычно стек имеет ограниченный размер. Таким образом, для больших массивов, определенных в стеке, может произойти сбой программы.

Другая проблема заключается в том, что размер массива в C++ должен быть выражением константы времени компиляции. Если размер массива должен быть определен во время выполнения, вы должны использовать оператор new, как в вашем примере, если он написан правильно:

size_t n = 20;

int *a = new int[n];

Есть еще одна проблема. Например, вы не можете возвращать массивы из функций и не можете возвращать указатель на первый элемент локального массива. Таким образом, единственный способ вернуть указатель на динамически размещенный массив или обернуть массив в структуру. Но последний способ неэффективен для больших массивов.

Оператор new может быть использован для выделения одного объекта. Например

int *p = int( 10 );

Наиболее часто оператор new для отдельных объектов используется, когда вам нужно выделить объект класса.

Другие вопросы по тегам