Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Строки и распределение памяти в VS++ 
:(
    Опции темы
Step
Дата 6.3.2003, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 5
Всего: 25



Цитата
Причём насколько я знаю, в книжках (я прочитал с полтора десятка) ничего на эту тему нет, этот вопрос подробно освещён только в одной - как-то там про VC++. Там ещё пишут, что если квадратные скобки опустить, то высвободится память только из под первого объекта.
я обэтом ни когда не думал, но в принципе вышеизложенное является логичным и это наверника так.


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
Fantasist
Дата 7.3.2003, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата
Это обязательно?
Причём насколько я знаю, в книжках (я прочитал с полтора десятка) ничего на эту тему нет



Ничего себе! Как это нет? Что же это за книжки такие? Если используется new[] то для него необходимо использовать delete[].


Цитата
Там ещё пишут, что если квадратные скобки опустить, то высвободится память только из под первого объекта



Помниться, по этому вопросу (о необходимости delete[]) большое обсуждение было. Вообще, как пологается по стандарту, я уже сказал, а вот как реализуют это компиляторы - вопрос другой. Чаще всего, и именно для такой реализации стандарт таким образом и был придуман, когда выделяется память с помощью new - где-то (положим, на два байта выше выделенного блока) сохраняется размер выделенного куска. Если выделение памяти происходит с помощью new[] - то сохраняется и количество выделенных элементов. А зачем нам это количество? Ведь delete может просто взять сохраненный размер выделенного блока и грохнуть его. Для простых типов это действительно так, но для пользовательских нужно знать сколько раз вызвать деструктор. То есть так и получается, что для простых типоа достадочно было и одного delete , а delete[] в общем-то излишен, однако для сложных типов это не так. С другой стороны, можно было бы всегда сохранять количество выделенных элементов, в независимости от того, используется new или new[] , однако это не так экономно, с точки зрения расходуемой памяти. Зачем хранить количество элементов для new, когда и так понятно, что он один?
Так и получается, что предпологается, что delete не смотрит на количество элементов (то есть просто считает, что он один), а delete[] смотрит. В большинстве реализаций, для простых типов, уничтожение с помощью delete будет оказывать тот же эффект, что и delete[] , так как сохраняется размер всего выделенного блока, а не размер элемента*количество элементов. Так что если применить delete, для памяти выделенной с помощью new[] , то память освободиться вся, но деструкор будет вызван только для первого элемента.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0736 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.