Вопрос по delete[]
От: Malyj Украина  
Дата: 13.03.08 18:19
Оценка:
При создании большого массива [1000000] system monitor показывает, что после delete память освобождаеться полностью. Если же создать массив [100000], то освобождаеться на 4Кб меньше, чем выделяеться при создании. При малых массивах [100] монитор не показывает увеличение privat bytes. Я новичок, обясните кто-нибудь от чего такой результат


bool* pbArr = new bool[100000];
delete[] pbArr;
Re: Вопрос по delete[]
От: Юрий Жмеренецкий ICQ 380412032
Дата: 13.03.08 19:25
Оценка: 2 (1)
Здравствуйте, Malyj, Вы писали:

M>При создании большого массива [1000000] system monitor показывает, что после delete память освобождаеться полностью. Если же создать массив [100000], то освобождаеться на 4Кб меньше, чем выделяеться при создании. При малых массивах [100] монитор не показывает увеличение privat bytes. Я новичок, обясните кто-нибудь от чего такой результат


Особенности реализации кучи в CRT. Т.е. поверх сервисов управления памятью, предоставляемых OC(VirtualAlloc например) существует дополнительный слой. Что там происходит — зависит от производителя, режимов компиляции, run-time настроек(могут присутствовать дополнительные функции для регулирования некоторых режимов) и т.п.
Re[2]: Вопрос по delete[]
От: игппук Беларусь  
Дата: 14.03.08 10:53
Оценка:
дополнительно к вышесказанному я бы еще порекомендовал не использовать кучу для выделения таких больших массивов.
проклятый антисутенерский закон
Re[3]: Вопрос по delete[]
От: Аноним  
Дата: 14.03.08 10:59
Оценка:
Здравствуйте, игппук, Вы писали:

И>дополнительно к вышесказанному я бы еще порекомендовал не использовать кучу для выделения таких больших массивов.


А что использовать?
Re[3]: Вопрос по delete[]
От: Аноним  
Дата: 14.03.08 11:00
Оценка:
Здравствуйте, игппук, Вы писали:

И>дополнительно к вышесказанному я бы еще порекомендовал не использовать кучу для выделения таких больших массивов.

А где? На стеке?
Re[4]: Вопрос по delete[]
От: ncode  
Дата: 14.03.08 11:05
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, игппук, Вы писали:


И>>дополнительно к вышесказанному я бы еще порекомендовал не использовать кучу для выделения таких больших массивов.

А>А где? На стеке? :super:
Можно на стеке (если влезет :)), можно статически, можно даже как memory mapped file.
Re: Вопрос по delete[]
От: Аноним  
Дата: 14.03.08 11:16
Оценка: -2 :))
Здравствуйте, Malyj, Вы писали:

M>При создании большого массива [1000000] system monitor показывает, что после delete память освобождаеться полностью. Если же создать массив [100000], то освобождаеться на 4Кб меньше, чем выделяеться при создании. При малых массивах [100] монитор не показывает увеличение privat bytes. Я новичок, обясните кто-нибудь от чего такой результат



M>
M>bool* pbArr = new bool[100000];
M>delete[] pbArr;
M>



Оператор new нужно создовать не больших обем память, а для больших обьем память стоит использовать GlobalAlloc, new не всегда коретно освобождает память.
Re[2]: Вопрос по delete[]
От: Left2 Украина  
Дата: 14.03.08 11:33
Оценка: +1
ЮЖ>(VirtualAlloc например)
Справедливости ради — всё же куда обычнее использование HeapAlloc. VirtualAlloc это более низкоуровневая функция.
... << RSDN@Home 1.2.0 alpha rev. 717>>
Re[2]: Вопрос по delete[]
От: McQwerty Россия  
Дата: 14.03.08 12:04
Оценка:
А> new не всегда коретно освобождает память.
С этого места немножко поподробнее, пожалуйста.
Re[2]: Вопрос по delete[]
От: sc Россия  
Дата: 14.03.08 12:39
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Malyj, Вы писали:


M>>При создании большого массива [1000000] system monitor показывает, что после delete память освобождаеться полностью. Если же создать массив [100000], то освобождаеться на 4Кб меньше, чем выделяеться при создании. При малых массивах [100] монитор не показывает увеличение privat bytes. Я новичок, обясните кто-нибудь от чего такой результат



M>>
M>>bool* pbArr = new bool[100000];
M>>delete[] pbArr;
M>>



А>Оператор new нужно создовать не больших обем память, а для больших обьем память стоит использовать GlobalAlloc, new не всегда коретно освобождает память.


Правильнее сказать, new вообще не освобождает память а выделяет. Ну да ладно. GlobalAlloc — это Win Api, что тоже не всегда подходит. Да и bool[100000] это не большой массив. Так что new в общем то не плох, но голые указатели лучше не использовать
Re[3]: Вопрос по delete[]
От: sc Россия  
Дата: 14.03.08 12:52
Оценка: :)
Еще добавлю, что использовать массивы bool не желательно. Я создал массив из 10 эл-тов и заполнил true/false/true...
Вот как это показывается в дебагере:
0x0035A478 00 01 00 01 00 01 00 01 00 01
Т.е. смысла в массивах bool никакого, и об этом, если мне память не изменяет, уже много раз писалось.
Re[3]: Вопрос по delete[]
От: Erop Россия  
Дата: 14.03.08 13:44
Оценка:
Здравствуйте, игппук, Вы писали:

И>дополнительно к вышесказанному я бы еще порекомендовал не использовать кучу для выделения таких больших массивов.


А почему? Win API куча вроде бы корректно это всё обрабатывает и большие блоки аллокирует непосредственно через VirtualAlloc. Я подозреваю, что и в OS Linux всё хорошо с этим.
Единственная система, на которой это было не так, которая мне вспоминается -- это MAC OS Classic. Там большие болоки хотелось таки выделять за пределами партиции приложения. Но это очень давно было и очень специфично всё-таки...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Вопрос по delete[]
От: Erop Россия  
Дата: 14.03.08 13:48
Оценка:
Здравствуйте, Аноним, Вы писали:

А>new не всегда коретно освобождает память.


Ты наверное имеешь в виду, что обычно new не возвращает память системе. Но обычно new себя так ведёт только с относительно небольшими блоками. А большие аллокирует сразу у системы и отдаёт сразу ей.
Насколько я понимаю, это так делается для борьбы с фрагментацией памяти на уровне системы (если в системе это понятие релевантно) и для ускорения работы new/delete

p.s.
Про то, что new обычно вообще редко память освобождает тут уже писали. Смешно сформулировал
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Вопрос по delete[]
От: игппук Беларусь  
Дата: 14.03.08 15:51
Оценка:
Здравствуйте, Аноним, Вы писали:

И>>дополнительно к вышесказанному я бы еще порекомендовал не использовать кучу для выделения таких больших массивов.

А>А где? На стеке?

большой пардон. я имел ввиду не на стеке
проклятый антисутенерский закон
Re[4]: Вопрос по delete[]
От: игппук Беларусь  
Дата: 14.03.08 15:53
Оценка:
Здравствуйте, Erop, Вы писали:

E>А почему? Win API куча вроде бы корректно это всё обрабатывает и большие блоки аллокирует непосредственно через VirtualAlloc. Я подозреваю, что и в OS Linux всё хорошо с этим.

E>Единственная система, на которой это было не так, которая мне вспоминается -- это MAC OS Classic. Там большие болоки хотелось таки выделять за пределами партиции приложения. Но это очень давно было и очень специфично всё-таки...

http://www.rsdn.ru/forum/message/2875556.1.aspx
Автор: игппук
Дата: 14.03.08


еще одна система, в которой я испытывал очень большие трудности после того, как выделял большие куски на стеке, была PalmOS.
проклятый антисутенерский закон
Re[5]: Вопрос по delete[]
От: игппук Беларусь  
Дата: 14.03.08 15:55
Оценка:
да и вообще, я выше сказал глупость. не обратил внимания, что память выделяется при помощи new. сори.
проклятый антисутенерский закон
Re[4]: Вопрос по delete[]
От: Vamp Россия  
Дата: 14.03.08 16:38
Оценка:
sc>Т.е. смысла в массивах bool никакого, и об этом, если мне память не изменяет, уже много раз писалось.
Непонятна ваша мысль...
Да здравствует мыло душистое и веревка пушистая.
Re[3]: Вопрос по delete[]
От: CreatorCray  
Дата: 14.03.08 17:16
Оценка: +1
Здравствуйте, игппук, Вы писали:

И>дополнительно к вышесказанному я бы еще порекомендовал не использовать кучу для выделения таких больших массивов.

Развеж это большой? Это мелочь.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[2]: Вопрос по delete[]
От: CreatorCray  
Дата: 14.03.08 17:16
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Оператор new нужно создовать не больших обем память, а для больших обьем память стоит использовать GlobalAlloc, new не всегда коретно освобождает память.

Бред!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[5]: Вопрос по delete[]
От: sc Россия  
Дата: 14.03.08 17:56
Оценка: :)
Здравствуйте, Vamp, Вы писали:

sc>>Т.е. смысла в массивах bool никакого, и об этом, если мне память не изменяет, уже много раз писалось.

V>Непонятна ваша мысль...

Нет, я конечно не совем прав, смысл есть. Только надо иметь ввиду, что хранится это все не в битах, а как в моем примере, в байтах. И если есть необходимость экономить память, то наверное имеет смысл сделать свой контейнер для bool (естественно stl совместимый). Например, взять за основу std::vector<int> и организовать побитовый доступ к нему.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.