Страница 2 из 2

Re: delete с [] и без

Добавлено: 22 июн 2009, 09:58
Romeo
&quot писал(а):А это не одно и то же ? Или у тебя -1 элемент массива не в байтах ?
Я не отдельное слово "байт" поставил под сомнение в твоём высказывании, а словосочетание "первые байты массива". В первых байтах массива расположен первый элемент массива и с этим спорить невозможно. Размер динамически выделенного массива хранится не в самом массиве, а в ячейке памяти перед началом массива и самому массиву не принадлежит. Кстати, стандартом это не гарантированно, но это так на всех линейках VC.
&quot писал(а):просто деструктор вызывается только для 0 элемента массива
А что, невызов деструктора - это не утечка памяти? :) А если в твоём классе в конструкторе делается new, а в деструкторе delete? Кстати, как ты определяешь, что утечки не произошло?

Re: delete с [] и без

Добавлено: 22 июн 2009, 10:32
sarturbest
:) Я имел ввиду, в вышесказанном программе.

" Кстати, как ты определяешь, что утечки не произошло? " - читай тему с начала там написана.

Re: delete с [] и без

Добавлено: 22 июн 2009, 10:46
Romeo
sarturbest писал(а): Открываю task manger, запускаю программу и смотрю на PF Usage. Все "нормально" PF Usage не изменяется.
Эксперимент не показателен. После завершения программы вся память, которая было выделена для приложения, возвращается системе обратно, потому таким образом ты лики не увидишь. После завершения приложения не освобождается память только глобально размещённых данных (Handles, GlobalAlloc и т.д.). Проблема ликов памяти не в том, что они заберут память у системы навсегда (точнее то перезагрузки), а в том, что они могут уложить приложение "на лопатки" во время его работы.

Re: delete с [] и без

Добавлено: 22 июн 2009, 10:59
sarturbest
Я тогда просто хотел сказать что память возвращается системе во время работы программы.

Re: delete с [] и без

Добавлено: 26 июн 2009, 19:36
Albor
А кто-то посматривал дамп самого указателя? Пример:
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[].

Re: delete с [] и без

Добавлено: 27 июн 2009, 11:55
Airhand
У тебя ошибка в коде: ты не создавал массив, создавал указатель на массив.

Re: delete с [] и без

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

По поводу того, где хранится размер динамически выделенного массива. Ты перед массивом точно проверял? Проверял значение *(p-1)?

Re: delete с [] и без

Добавлено: 27 июн 2009, 13:28
Airhand
Romeo писал(а):Создал указатель на массив :) :) :)
Ну-ка покажи мне своё динамическое создание массива, удиви меня в очередной раз :)
Да, ошибся. Я пользуюсь STL и поэтому ошибся.

Re: delete с [] и без

Добавлено: 29 июн 2009, 19:14
Albor
Romeo писал(а): По поводу того, где хранится размер динамически выделенного массива. Ты перед массивом точно проверял? Проверял значение *(p-1)?
Romeo, не нашёл я размер, по этому адресу у меня ни чего осмысленного. А то что по началу я ошибочно принимал принимал за размер, была переменная sz. Ну, да век живи, век учись! :)

Re: delete с [] и без

Добавлено: 30 июн 2009, 08:41
Romeo
ОК, через два дня я создам здесь пост с детальными исследованиями. Просто сейчас нет времени и нет студии под рукой.