delete с [] и без

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

&quot писал(а):А это не одно и то же ? Или у тебя -1 элемент массива не в байтах ?
Я не отдельное слово "байт" поставил под сомнение в твоём высказывании, а словосочетание "первые байты массива". В первых байтах массива расположен первый элемент массива и с этим спорить невозможно. Размер динамически выделенного массива хранится не в самом массиве, а в ячейке памяти перед началом массива и самому массиву не принадлежит. Кстати, стандартом это не гарантированно, но это так на всех линейках VC.
&quot писал(а):просто деструктор вызывается только для 0 элемента массива
А что, невызов деструктора - это не утечка памяти? :) А если в твоём классе в конструкторе делается new, а в деструкторе delete? Кстати, как ты определяешь, что утечки не произошло?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
sarturbest
Сообщения: 13
Зарегистрирован: 16 июн 2009, 23:52

:) Я имел ввиду, в вышесказанном программе.

" Кстати, как ты определяешь, что утечки не произошло? " - читай тему с начала там написана.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

sarturbest писал(а): Открываю task manger, запускаю программу и смотрю на PF Usage. Все "нормально" PF Usage не изменяется.
Эксперимент не показателен. После завершения программы вся память, которая было выделена для приложения, возвращается системе обратно, потому таким образом ты лики не увидишь. После завершения приложения не освобождается память только глобально размещённых данных (Handles, GlobalAlloc и т.д.). Проблема ликов памяти не в том, что они заберут память у системы навсегда (точнее то перезагрузки), а в том, что они могут уложить приложение "на лопатки" во время его работы.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
sarturbest
Сообщения: 13
Зарегистрирован: 16 июн 2009, 23:52

Я тогда просто хотел сказать что память возвращается системе во время работы программы.
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

А кто-то посматривал дамп самого указателя? Пример:
cpp Код:
[LEFT]int sz(5);
int * p=new int[sz];
for(int i=0;i<sz;i++)
*(p+i)=i;
delete p;
[/LEFT]

Просматриваем дамп по адресу &p: первые 4- значение указателя, сразу за ним 4 байта - размер массива, завершает это последовательность C0 FF 12 00. Теперь смотрим дамп куда указывает p: после выполнения delete p; всё что проинициализировано циклом вытирается. Как это понимать? Память освобождена? Зачем рядом с адресом массива хранится его размер? Кто прокомментирует?
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Странно, сегодня запустил тот же пример и получил совсем другой результат: размер массива не пишется ни перед массивом, ни в указателе (&p), но результат delete p; тот же. Более того, если я продолжаю код строкой p=new int[sz]; а далее цикл инициализации массива, то, у меня, p указывает на тот же участок памяти, что и до delete p;, значит память всётаки освобождается. Конечно, возможно это частный случай, связанный с VS-6, поэтому на все 100 не уверен, что применение такого синтаксиса допустимо.
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Нашёл причину: сразу за значением указателя находилась переменная sz, а сегодня запускал пример с константой, поэтому так получилось. Но факт остаётся фактом - память освобождается. Однако, нужно придерживаться стандарта, а там написано, если это массив, то delete[].
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

У тебя ошибка в коде: ты не создавал массив, создавал указатель на массив.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Airhand писал(а):У тебя ошибка в коде: ты не создавал массив, создавал указатель на массив.
Создал указатель на массив :) :) :)
Ну-ка покажи мне своё динамическое создание массива, удиви меня в очередной раз :)
&quot писал(а):Как это понимать? Память освобождена? Зачем рядом с адресом массива хранится его размер? Кто прокомментирует?
Albor, память удаляется, но вот деструкторы не вызываются. Хранить размер нужно для того, чтобы знать сколько раз нужно вызвать деструктор.

По поводу того, где хранится размер динамически выделенного массива. Ты перед массивом точно проверял? Проверял значение *(p-1)?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

Romeo писал(а):Создал указатель на массив :) :) :)
Ну-ка покажи мне своё динамическое создание массива, удиви меня в очередной раз :)
Да, ошибся. Я пользуюсь STL и поэтому ошибся.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

Romeo писал(а): По поводу того, где хранится размер динамически выделенного массива. Ты перед массивом точно проверял? Проверял значение *(p-1)?
Romeo, не нашёл я размер, по этому адресу у меня ни чего осмысленного. А то что по началу я ошибочно принимал принимал за размер, была переменная sz. Ну, да век живи, век учись! :)
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

ОК, через два дня я создам здесь пост с детальными исследованиями. Просто сейчас нет времени и нет студии под рукой.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить