Russian Qt Forum
Ноябрь 15, 2024, 06:56 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как delete[] узнаёт длинну массива?  (Прочитано 3977 раз)
yarick
Гость
« : Апрель 22, 2013, 17:43 »

Напишем вот такой простой код для класса

Код:
MyClass *pClassArray = new MyClass[5];
delete [] pClassArray;

Как delete узнаёт, что массив именно 5 элементов? Насколько я понял, там какой-то символ завершающий стоит. А если в моих данных встретиться этот символ вдруг? Я ведь могу также создать массив из int например...

И ещё такой вопрос- почему если это указатель, к элементам массива нужно обращаться через точку? Например так

Код:
pClassArray[1].doSome();
//pClassArray[1]->doSome();//error: base operand of '->' has non-pointer type 'MyClass'
« Последнее редактирование: Апрель 22, 2013, 17:47 от Ярик » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Апрель 22, 2013, 17:47 »

Как delete узнаёт, что массив именно 5 элементов? Насколько я понял, там какой-то символ завершающий стоит. А если в моих данных встретиться этот символ вдруг? Я ведь могу также создать массив из int например...
Это все зависит от реализации. Часто, размер сохраняется в специальном контрольном блоке, перед самим выделяемым буфером. Но еще раз повторюсь, это зависит от реализации.
Вы можете не волноваться и использовать любые символы. Улыбающийся
Записан
Bepec
Гость
« Ответ #2 : Апрель 22, 2013, 17:49 »

Учить Учить и Учить С++.  Там не символ. Там структура массива данных в С++. Так что любыми символами пользуйтесь.

Потому надо обращаться через точку, потому что у вас указатель на массив элементов. А не указатель на массив указателей.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Апрель 22, 2013, 17:49 »

И ещё такой вопрос- почему если это указатель, к элементам массива нужно обращаться через точку? Например так
Потому что вы определяете массив объектов (а не массив указателей на объект).
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #4 : Апрель 24, 2013, 12:27 »

Это знает не delete, а конкретный компилятор.

Как правило, оператор new для массивов выделяет чуть больше памяти, чем нужно. Возвращая пользователю адрес с некоторым смещением.

Таким образом, первые некоторое количество байт хранят служебную информацию о блоке.
Когда компилятор встречает delete[], он отматывает от адреса эти несколько байт назад, и извлекает служебную информацию. После чего он уже знает как именно нужно удалять блок.

Пользователи могут получать доступ к служебным данным, при помощи функций-расширений от компилятора.

Например, для компиляторов от вижал-студии, размер выделенного блока можно узнать вот так:

http://msdn.microsoft.com/en-us/library/z2s077bc.aspx
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Апрель 25, 2013, 07:09 »

Как delete узнаёт, что массив именно 5 элементов? Насколько я понял, там какой-то символ завершающий стоит. А если в моих данных встретиться этот символ вдруг? Я ведь могу также создать массив из int например...
Никакого символа-терминатора там нет. Блок знает свой размер, и обычно блоки связаны в список. Техника кучи мало изменилась за последние 20 лет
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.078 секунд. Запросов: 23.