Название: Как delete[] узнаёт длинну массива? Отправлено: yarick от Апрель 22, 2013, 17:43 Напишем вот такой простой код для класса
Код: MyClass *pClassArray = new MyClass[5]; Как delete узнаёт, что массив именно 5 элементов? Насколько я понял, там какой-то символ завершающий стоит. А если в моих данных встретиться этот символ вдруг? Я ведь могу также создать массив из int например... И ещё такой вопрос- почему если это указатель, к элементам массива нужно обращаться через точку? Например так Код: pClassArray[1].doSome(); Название: Re: Как delete[] узнаёт длинну массива? Отправлено: Old от Апрель 22, 2013, 17:47 Как delete узнаёт, что массив именно 5 элементов? Насколько я понял, там какой-то символ завершающий стоит. А если в моих данных встретиться этот символ вдруг? Я ведь могу также создать массив из int например... Это все зависит от реализации. Часто, размер сохраняется в специальном контрольном блоке, перед самим выделяемым буфером. Но еще раз повторюсь, это зависит от реализации.Вы можете не волноваться и использовать любые символы. :) Название: Re: Как delete[] узнаёт длинну массива? Отправлено: Bepec от Апрель 22, 2013, 17:49 Учить Учить и Учить С++. Там не символ. Там структура массива данных в С++. Так что любыми символами пользуйтесь.
Потому надо обращаться через точку, потому что у вас указатель на массив элементов. А не указатель на массив указателей. Название: Re: Как delete[] узнаёт длинну массива? Отправлено: Old от Апрель 22, 2013, 17:49 И ещё такой вопрос- почему если это указатель, к элементам массива нужно обращаться через точку? Например так Потому что вы определяете массив объектов (а не массив указателей на объект).Название: Re: Как delete[] узнаёт длинну массива? Отправлено: _Bers от Апрель 24, 2013, 12:27 Это знает не delete, а конкретный компилятор.
Как правило, оператор new для массивов выделяет чуть больше памяти, чем нужно. Возвращая пользователю адрес с некоторым смещением. Таким образом, первые некоторое количество байт хранят служебную информацию о блоке. Когда компилятор встречает delete[], он отматывает от адреса эти несколько байт назад, и извлекает служебную информацию. После чего он уже знает как именно нужно удалять блок. Пользователи могут получать доступ к служебным данным, при помощи функций-расширений от компилятора. Например, для компиляторов от вижал-студии, размер выделенного блока можно узнать вот так: http://msdn.microsoft.com/en-us/library/z2s077bc.aspx Название: Re: Как delete[] узнаёт длинну массива? Отправлено: Igors от Апрель 25, 2013, 07:09 Как delete узнаёт, что массив именно 5 элементов? Насколько я понял, там какой-то символ завершающий стоит. А если в моих данных встретиться этот символ вдруг? Я ведь могу также создать массив из int например... Никакого символа-терминатора там нет. Блок знает свой размер, и обычно блоки связаны в список. Техника кучи мало изменилась за последние 20 лет |