Форум программистов, компьютерный форум CyberForum.ru

new[] - delete[] - C++

Восстановить пароль Регистрация
 
RobbyZero
Сообщений: n/a
27.07.2013, 09:27     new[] - delete[] #1
Всем привет. Глупый вопрос, но тем не менее, он меня крайне заинтересовал.
Вот например, есть такой код:
C++
1
2
3
4
5
void main()
{
      int *arr = new int[10];
      delete[] arr;
}
Данный код не несет никаких утечек памяти, т.к. память выделенная в размере 40 байт память освобождается оператором delete[]. Вопрос следующий: каким образом оператор delete[] узнал сколько элементов содержит мой массив (сколько байт), чтобы полностью освободить необходимую память?
Мои предположение таково: операторы new-delete, где то у себя сохраняют эту информацию. Либо ОС?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.07.2013, 09:27     new[] - delete[]
Посмотрите здесь:

C++ new delete
C++ delete this
C++ delete и delete[]
"delete [] a, b;" эквивалентно "delete [] a; delete [] b;"? C++
C++ delete[]
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
yutr777
 Аватар для yutr777
4 / 4 / 0
Регистрация: 07.04.2013
Сообщений: 85
27.07.2013, 09:49     new[] - delete[] #2
Допустим красно-черное дерево. Один узел пусть весит 30 байт.
Ты представь, если "ГДЕ-то" будет сохраняться эта информация, сколько это "сохранение" съест. Вдруг это телефонная база данных, хранится в виде КРДП. ИМХО, ты указал на часть памяти, а delete освободило эту часть памяти.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
27.07.2013, 10:08     new[] - delete[] #3
yutr777, для одиночного объекта и нет необходимости хранить размер - его можно получить зная тип объекта. Для массивов помимо размера одного элемента необходимо знать количество элементов.
Где это будет храниться - зависит от реализации.
http://www.parashift.com/c++-faq-lit...new-array.html
RobbyZero
Сообщений: n/a
27.07.2013, 10:20     new[] - delete[] #4
0x10, спасибо за ссылку с решением. Класть размер массива слева от его первого элемента - крутое решение.
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
27.07.2013, 11:00     new[] - delete[] #5
а вот что пишет Б. Страуструп:

Для того чтобы освободить память, выделенную оператором new, операторы delete
и detete[ ] должны иметь возможность определить размер объекта. Из этого следует,
что стандартная реализация new выделяет памяти немного больше, чем потребова-
лось бы для статического объекта. Как правило, используется одно дополнительное
слово для хранения размера объекта
.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
12.03.2014, 15:53     new[] - delete[] #6
Вот нарисовал тут картинку, все думал куда бы ее приткнуть. Х)

Смысл плаката - наглядное представление почему:
new с delete хорошо
new[] с delete[] хорошо
new с delete[] проканает
new[] с delete плохо

new[] - delete[]

Схемка показывает, что будет, если динамически создавать и удалять структуру d(dot) с разными комбинациями квадратных скобок при операторах.
Представлена всего лишь одна реализация данных операторов и не факт, что ошибки будут именно такими, но на то оно и неопределенное поведение.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
12.03.2014, 15:55     new[] - delete[] #7
Цитата Сообщение от RobbyZero Посмотреть сообщение
Вопрос следующий: каким образом оператор delete[] узнал сколько элементов содержит мой массив (сколько байт), чтобы полностью освободить необходимую память?
это определяется реализацией
Jupiter
12.03.2014, 16:49
  #8

Не по теме:

Цитата Сообщение от SatanaXIII Посмотреть сообщение
Схемка показывает,
int* pointer = new d[2];

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.03.2014, 16:52     new[] - delete[]
Еще ссылки по теме:

C++ delete[]
New/Delete C++
New delete C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
SatanaXIII
12.03.2014, 16:52     new[] - delete[]
  #9

Не по теме:

Jupiter, ага. Косяк.

Yandex
Объявления
12.03.2014, 16:52     new[] - delete[]
Ответ Создать тему
Опции темы

Текущее время: 01:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru