Автор Гілка: c++11 - for(T t : pt) і масиви в стилі C++  (Прочитано 2431 раз)

Відсутній Yola

  • Дописувач
  • **
  • дописів: 70
  • Карма: +0/-0
  • http://uk.wikipedia.org/wiki/User:Igor_Yalovecky
Чому не працює для масивів виділених за допомогою new?

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3745
  • Карма: +9/-0
  • Програміст
Re: c++11 - for(T t : pt) і масиви в стилі C++
« Відповідей #1 : 2012-09-27 23:17:41 »
Чому не працює для масивів виділених за допомогою new?

А як воно взнає довжину масиву? sizeof() на вказівник правильної відповіді не дасть. ;-)

Вам потрібен контейнер, напр. Vector, який матиме потрібний ітератор.
[Fedora Linux]

Відсутній Yola

  • Дописувач
  • **
  • дописів: 70
  • Карма: +0/-0
  • http://uk.wikipedia.org/wiki/User:Igor_Yalovecky
Re: c++11 - for(T t : pt) і масиви в стилі C++
« Відповідей #2 : 2012-09-28 11:05:32 »
тобто це працює лише з масивами в стеці. Ок, тепер зрозуміло. Принагідно, завжди було цікаво, де new або malloc зберігають відомості про розмір блока пам'яті, але це мабуть велика таємниця))

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3745
  • Карма: +9/-0
  • Програміст
Re: c++11 - for(T t : pt) і масиви в стилі C++
« Відповідей #3 : 2012-09-28 14:09:40 »
Принагідно, завжди було цікаво, де new або malloc зберігають відомості про розмір блока пам'яті, але це мабуть велика таємниця))

В класичній реалізації malloc()-у від Кернігана і Рітчі — зберігається перед початком виділеного блоку памʼяті. Тобто виділяється блок трохи більшого розміру ніж потрібно, і перші кілька байт використовуються для збереження сервісної інформації. Дуже зручно робити доступ до такої інформації — (HEADER *)p-1.

В сучасних реалізаціях libc malloc() працює принципово інакше, але в своїй програмі можна перевизначити malloc() і free() і зберігати цю інформацію самому. Це напр. використовують для реалізації примітивних буферів чи GC. Див. soap_malloc() з gsoap2 для прикладу.
[Fedora Linux]