![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Step |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
Fantasist |
|
||||
![]() Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Ничего себе! Как это нет? Что же это за книжки такие? Если используется new[] то для него необходимо использовать delete[].
Помниться, по этому вопросу (о необходимости delete[]) большое обсуждение было. Вообще, как пологается по стандарту, я уже сказал, а вот как реализуют это компиляторы - вопрос другой. Чаще всего, и именно для такой реализации стандарт таким образом и был придуман, когда выделяется память с помощью new - где-то (положим, на два байта выше выделенного блока) сохраняется размер выделенного куска. Если выделение памяти происходит с помощью new[] - то сохраняется и количество выделенных элементов. А зачем нам это количество? Ведь delete может просто взять сохраненный размер выделенного блока и грохнуть его. Для простых типов это действительно так, но для пользовательских нужно знать сколько раз вызвать деструктор. То есть так и получается, что для простых типоа достадочно было и одного delete , а delete[] в общем-то излишен, однако для сложных типов это не так. С другой стороны, можно было бы всегда сохранять количество выделенных элементов, в независимости от того, используется new или new[] , однако это не так экономно, с точки зрения расходуемой памяти. Зачем хранить количество элементов для new, когда и так понятно, что он один? Так и получается, что предпологается, что delete не смотрит на количество элементов (то есть просто считает, что он один), а delete[] смотрит. В большинстве реализаций, для простых типов, уничтожение с помощью delete будет оказывать тот же эффект, что и delete[] , так как сохраняется размер всего выделенного блока, а не размер элемента*количество элементов. Так что если применить delete, для памяти выделенной с помощью new[] , то память освободиться вся, но деструкор будет вызван только для первого элемента. -------------------- Волны гасят ветер... |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |