Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

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

5.7K
09 августа 2011 года
Lindemann66
193 / / 21.07.2011
Всем привет!

Не сочтите за глупость, но возник интересный вопрос, над которым давно думаю, а овтета нигде не находил

Вот нужно, допустим, создать массив из n элементов

Сделать это можно 2-мя способами

 
Код:
int arr[n];

и
 
Код:
int *arr = new int[n];


Но в одном случае создание массива сопровождается выделением памяти, а в другом - без
В чём принципиальная разница?
Я понимаю, в Qt сразу написано - объекты QObject необходимо создавать с выделением памяти, чтобы не было проблем
Понятно, так и делаем. А тут как правильней?
277
09 августа 2011 года
arrjj
1.7K / / 26.01.2011
Память выделяется в обоих случаях. Просто в первом случае она выделяется в стеке а во втором в куче. Стек очищается при возврате из функции, а из кучи нужно убивать самостоятельно оператором delete. Без выделения памяти обходятся только переменные global , static и extern вроде, для них память выделяется при запуске программы в сегменте BSS
[COLOR="silver"]//Както так вроде[/COLOR]
7
09 августа 2011 года
@pixo $oft
3.4K / / 20.09.2006
Ну как бы и секция(а не сегмент) .data есть.Так что не все данные на стеке;например,переменные с областью видимости во всём модуле

[COLOR="#c0c0c0"]Да что там,их и в коде можно разместить…:D[/COLOR]
316
09 августа 2011 года
Alm3n
889 / / 29.05.2009
давайте я тогда еще дополню, что память может совсем не выделяться, а переменная будет храниться в регистре. в первом случае.
18K
10 августа 2011 года
rrrFer
50 / / 08.09.2008
загрузили бедного Lindemann66...стеки..кучи..секции и т.п.
Цитата:
В чём принципиальная разница?


В первом случае массив статический, во втором - динамический.

 
Код:
int arr[n];

n - константа
 
Код:
const int a = 5;
    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;
}


Т.е. размер массива заранее не известен, и вводится пользователем. В этом случае нужно использовать динамический массив( или vector, например ).

new выделяет памяти больше чем занял бы статический массив/объект, т.к. в этой же памяти помещается информация о размере объекта, чтобы можно было правильно освободить память.
277
10 августа 2011 года
arrjj
1.7K / / 26.01.2011
Цитата: rrrFer

У arrjj есть недочет...

для освобождения памяти из под массивов используется оператор delete[] (со скобочками)



Ну это уже уточнение :) Стандарт c++ предусматривает 4 оператора : new, new[], delete, delete []

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог