Russian Qt Forum

Программирование => С/C++ => Тема начата: yarick от Апрель 22, 2013, 17:43



Название: Как delete[] узнаёт длинну массива?
Отправлено: 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'


Название: 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 лет