Распределение размера с помощью нового оператора
У меня есть два сомнения по поводу нового оператора
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 для отдельных объектов используется, когда вам нужно выделить объект класса.