Отличие операции с выделением памяти и без
Не сочтите за глупость, но возник интересный вопрос, над которым давно думаю, а овтета нигде не находил
Вот нужно, допустим, создать массив из n элементов
Сделать это можно 2-мя способами
Код:
int arr[n];
и
Код:
int *arr = new int[n];
Но в одном случае создание массива сопровождается выделением памяти, а в другом - без
В чём принципиальная разница?
Я понимаю, в Qt сразу написано - объекты QObject необходимо создавать с выделением памяти, чтобы не было проблем
Понятно, так и делаем. А тут как правильней?
[COLOR="silver"]//Както так вроде[/COLOR]
[COLOR="#c0c0c0"]Да что там,их и в коде можно разместить…:D[/COLOR]
давайте я тогда еще дополню, что память может совсем не выделяться, а переменная будет храниться в регистре. в первом случае.
Цитата:
В чём принципиальная разница?
В первом случае массив статический, во втором - динамический.
Код:
int arr[n];
n - константа
Код:
const int a = 5;
double b[ a ];
double b[ a ];
без const работать не будет. Память выделяется при попадании массива в область видимости. Использовать статический массив можно когда размер массива заранее известен.
Память под динамический массив выделяется при выполнении оператора new(ну или malloc, calloc, farmalloc и т.п.). При динамическом выделении памяти вызываются функции API для работы с кучей(ну описано выше у arrjj ), если интересно - то в WINAPI это HeapAlloc и HeapFree( ссылка: http://msdn.microsoft.com/en-us/library/aa366597%28v=vs.85%29.aspx , дальше найдешь :) )
У arrjj есть недочет...
Цитата:
убивать самостоятельно оператором delete
для освобождения памяти из под массивов используется оператор delete[] (со скобочками)
Коротенький пример:
Код:
int main( ) {
double *a;
int b;
cin >> b;
if( b > 0 )
a = new double[ b ];
else
a = new double[ 15 ];
delete [] a;
return 0;
}
double *a;
int b;
cin >> b;
if( b > 0 )
a = new double[ b ];
else
a = new double[ 15 ];
delete [] a;
return 0;
}
Т.е. размер массива заранее не известен, и вводится пользователем. В этом случае нужно использовать динамический массив( или vector, например ).
new выделяет памяти больше чем занял бы статический массив/объект, т.к. в этой же памяти помещается информация о размере объекта, чтобы можно было правильно освободить память.