Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Igjule
Зарегистрирован: 20.07.2006 Сообщения: 2 Откуда: Челябинск
|
Добавлено: Чт Июл 20 2006 07:25 Заголовок сообщения: Динамические массивы в Delphi |
|
|
Подскажите, кто знает:
У меня есть динамический массив, в котором я храню объекты своего класса. По сути он содержит указатели на участки памяти, содержащие значение и поля объектов.
Когда я заменяю (выполняю присваивание) один элемент массива другим, фактически в массиве меняется указатель: он после присваивания указывает на участок памяти, содержащий новый объект.
Вопрос: нужно ли удалять старый объект (метод Free) или память из под старого объекта автоматически освобождается (больше ведь на этот участок памяти ничего не указывает!!!)?
Пишу в Delphi 7.
Заранее спасибо ![Smile](images/smiles/icon_smile.gif) |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
D3DoS
Зарегистрирован: 19.07.2006 Сообщения: 2
|
Добавлено: Чт Июл 20 2006 21:09 Заголовок сообщения: |
|
|
ИМХО, если сравнивать с теми же сями, то должен остаться мусор по данному адресу. _________________ >~))@> >~))@> >~))@> |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Вт Июл 25 2006 22:36 Заголовок сообщения: |
|
|
Если на объект не указывает элемент массива, это еще не значит, что на него ничто не указывает. Ибо из завета программера нам известно: то, что было порождено в памяти компа человеком, и должно быть человеком низвергнуто. Более того, если массив (не важно, динамический или статический) состоит из Pointer, а элементы указывают на классы, надо зачищать не поинтер, а непосредственно класс: (SomeArray[1] as TClass).Free. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
and3008
Зарегистрирован: 12.10.2001 Сообщения: 14893 Откуда: Н.Новгород
|
Добавлено: Ср Июл 26 2006 00:28 Заголовок сообщения: |
|
|
Объясню еще популярней.
Для создания элемента массива системой, по просьбе вашего прикладного софта, выделяется память.
Если вам кусок памяти больше не нужен, то верните его системе.
Если вы этого делать не будете, то получите софт с проблемой текучести памяти. Т.е. ваш софт будет пожирать память пока она у системы не кончится. Скорость "пожОра" конечно зависит от того, настолько интенсивно вы свой массив юзаете в плане создавания/удаления элементов.
Не надо так делать. Это называется "наживать геморой на свою задницу". |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
sniper::p
Зарегистрирован: 04.10.2005 Сообщения: 237 Откуда: rus/73
|
Добавлено: Ср Июл 26 2006 23:13 Заголовок сообщения: |
|
|
Mytilus Galloprovincialis писал(а): | (SomeArray[1] as TClass).Free. | Да, в этом смысле С++ куда элегантней new Type; delete pObj _________________ Нет предела совершенствованию |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Сб Июл 29 2006 03:22 Заголовок сообщения: |
|
|
sniper::p писал(а): | Да, в этом смысле С++ куда элегантней new Type; delete pObj |
Не скажи. Вот пример:
Код: |
TWinControl *WinControl = new TWinControl(0);
TControl *Control = WinControl;
|
Писать delete Control в данном случае не верно. И если, допустим, вид delete WinControl нас чем-то не устраивает, придется написать delete (TWinControl *)Control.
А теперь сравни (Control as TWinControl).Free и delete (TWinControl *)Control.
Как говорится, те же яйца. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
sniper::p
Зарегистрирован: 04.10.2005 Сообщения: 237 Откуда: rus/73
|
Добавлено: Пн Июл 31 2006 22:15 Заголовок сообщения: |
|
|
Согласен, однако, не так уж часто лично я использую приведение типа указателя перед удалением объекта ![Smile](images/smiles/icon_smile.gif) _________________ Нет предела совершенствованию |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
|