Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.03.14;
Скачать: [xml.tar.bz2];

Вниз

Удалять ли самому обьекты?   Найти похожие ветки 

 
GrTik   (2004-03-01 18:13) [0]

Мастера, засовываю в Strings методом AddObject обьекты - приложение само удалит их или мне надо руцямы?


 
Тимохов   (2004-03-01 18:14) [1]

надо удалять


 
GrTik   (2004-03-01 18:16) [2]

а на каком событии?
Form.Destroy?


 
Тимохов   (2004-03-01 18:17) [3]


> GrTik (01.03.04 18:16) [2]

это уж,где захотите. факт: удалять надо. а вот где - решайте сами. Да в form.destroy. Лучше в событии OnDestroy


 
Sergey_Masloff   (2004-03-01 18:55) [4]

Тимохов © (01.03.04 18:17) [3]
>Лучше в событии OnDestroy
Чем лучше?


 
Тимохов   (2004-03-01 18:57) [5]


> Sergey_Masloff (01.03.04 18:55) [4]

Лучше соответствует стандарту, насаждаемому дельфи. Только и всего.


 
VMcL   (2004-03-01 20:30) [6]

>>GrTik (01.03.04 18:16) [2]
>а на каком событии?

Смотря где создается Strings. Если создал в FormCreate, то хорошим решением будет разрушать в FormDestroy.


 
Cobalt   (2004-03-01 23:01) [7]

VMcL © (01.03.04 20:30) [6]
Давно так не ржал :)))
Просто представил, что, если "strings" - локальная переменная метода FormCreate...


 
Anatoly Podgoretsky   (2004-03-01 23:06) [8]

А с чего ты решил, что локальная, а не поле и что плохого в локальной переменной?


 
Cobalt   (2004-03-01 23:21) [9]

Anatoly Podgoretsky © (01.03.04 23:06) [8]
Да ни с чего, просто представил все возможные варианты...

Люди спрашивающие, они ведь иногда имеют в виду вовсе не то, что некоторые думают.
Например, спрашивает человек, как в Дельфи работать с REG_MULTI_SZ. Я, конечно, думаю, что с остальными типами он знает как работать - а оказывается, что нет
http://delphimaster.net/view/7-1078081303/


 
Defunct   (2004-03-01 23:55) [10]

> Мастера, засовываю в Strings методом AddObject обьекты - приложение само удалит их или мне надо руцямы?

На выходе из приложения вся выделенная память освободится. Так что можно особо не переживать насчет удаления.


 
Игорь Шевченко   (2004-03-02 00:54) [11]

Defunct © (01.03.04 23:55)


> На выходе из приложения вся выделенная память освободится
> Так что можно особо не переживать насчет удаления.


А вот такой ответ хуже, чем никакой.

---
LMD


 
Defunct   (2004-03-02 01:10) [12]

> Игорь Шевченко © (02.03.04 00:54) [11]

>> На выходе из приложения вся выделенная память освободится
>> Так что можно особо не переживать насчет удаления.

>А вот такой ответ хуже, чем никакой.
Забобонни люды боялысь кажанив за йих незвычайный выгляд та потаемный образ життя. (C)

Где опровержения того, что это не так? (см. выделенное жирным).


 
Alex Konshin   (2004-03-02 01:22) [13]

Defunct © (02.03.04 01:10) [12]
В вопросе не сказано, какого рода там объекты. Вполне возможно, что освобождения памяти и не достаточно.

В любом случае это полохой тон - не чистить за собой, если этой войдет в привычку, что потом будут проблемы. Учитывая предполагаемый уровень автора вопроса, все-таки действительно не следует давать такие советы, пусть учатся делать так, как надо, а уж потом с осознанием того, что происходит, он и сам дойдет до других возможностей.


 
Юрий Зотов   (2004-03-02 01:41) [14]

> Defunct © (02.03.04 01:10) [12]

> На выходе из приложения вся выделенная память освободится

Угу, это точно. Но вот беда - не будут вызваны деструкторы тех самых объектов, которые надо было бы убивать ручками. А в этих самых деструкторах запросто (и очень часто) могут быть прописаны вещи типа FreeLibrary, DeleteObject, CloseHandle, ReleaseDC и т.п. - то есть, освобождение каких-то системных ресурсов (либо декремент счетчика ссылок на них, что по сути одно и то же). И окажутся ресурсы эти неосвобожденными. А в итоге, через сколько-то запусков такой программы система скажет "милок, не могу больше, у меня ресурсов не хватает" - и все дружно начнут кричать "масдай".

И правильно ведь начнут-то. Действительно MD.

Вот почему "такой ответ хуже, чем никакой" - потому что он плохому и неверному учит.


 
Defunct   (2004-03-02 02:20) [15]

Alex Konshin © (02.03.04 01:22) [13]
> пусть учатся делать так, как надо, а уж потом с осознанием того, что происходит, он и сам дойдет до других возможностей.

Юрий Зотов © (02.03.04 01:41) [14]
> Вот почему "такой ответ хуже, чем никакой" - потому что он плохому и неверному учит.


Да, так-то оно так. Но предполагаю, каждый когда-нибудь нажимал ctrl-alt-del и возможно даже снимал какую-то задачу. Неужели при этом срабатывают все деструкторы всех объектов в т.ч. и CloseHandle и ReleaseDC. Конечно же - нет, при снятии задачи выполняется функция KillProcess. Давайте предположим, что все-таки при снятии задачи выполняются все деструкторы созданных объектов, тогда давно все бы кричали: «система работает "масдай" как медленно» т.к. даже не позволяет быстро снять бесполезный процесс. Что же происходит с ресурсами системы? Win9x не освобождает занятые ресурсы, а вот NT системы справляются с этим «на ура», не говоря о закрытии отрытых «убиваемым» процессом файлов, окон, display contexts и т.п. Отсюда Win95 иногда называют «масдай», что никогда не говорят об NT.

А теперь смотрим в заголовок вопроса и видим D6, W2k. Так что проблем с системными ресурсами никаких не будет независимо от содержимого объектов. Взяв во внимание характер вопроса: надо ли удалять объекты или не надо, можно сказать как надо так и не надо (в равной степени будет справедливо). Поясню: если объектов в программе используется много, а устаревшие объекты теряют ценность, то тогда естественно надо их удалять, для того чтобы освободить память (она же не бесконечна). Если объектов мало, либо все объекты используются постоянно в процессе работы программы, то их удаление потребуется только на выходе из программы. Исходя из таких рассуждений, приходим к выводу, что иногда можно особо не заботиться об удалении объектов. Взяв во внимание компетенцию автора (сам факт возникновения такого вопроса), возможно, он хотел услышать именно это: при выходе из программы вся выделенная в процессе работы программы память освобождается.

С уважением.


 
Petr V. Abramov   (2004-03-02 03:30) [16]

> А теперь смотрим в заголовок вопроса и видим D6, W2k.
И завтра видим вопрос "а почему у меня под W2K все работает, а под Win98 глючит". И видим его до 2006 (по-моему?) года.
> На выходе из приложения вся выделенная память освободится. Так что можно особо не переживать насчет удаления.
Рано или поздно, при зависании, вся память освододится. Но, например, при завершении DLL, написанной с использованием VCL, она освободится с Runtime Error 216. Try..except не помогает, проверено :)
> На выходе из приложения вся выделенная память освободится. Так что можно особо не переживать насчет удаления.
Г.. на улице тоже дворниками чистится. Рано или поздно


 
Soft   (2004-03-02 03:57) [17]

>>GrTik (01.03.04 18:13)
>>Мастера, засовываю в Strings методом AddObject обьекты - приложение само удалит их или мне надо руцямы?

Удалит, но только после полного закрытия приложения. Если не очищать руцями, то залоченная память будет накапливатся, пока приложение не свалится.


 
Defunct   (2004-03-02 04:12) [18]

Petr V. Abramov © (02.03.04 03:30) [16]

Не надо искажать истину. Было бы всё так скврено, никто никогда бы не пользовался Ctrl-Alt-Del "снять задачу". А MS не встраивала бы эту возможность в каждую из своих OS. Относитесь немного проще к таким вопросам как удаление ненужных объектов на выходе (сами удалятся, для того и ОС чтобы дворником работать).

Факт: проследить удаление абсолютно всех объектов в программе невозможно, особенно когда объем программы превышает 20 тыс. строк.

> Рано или поздно, при зависании, вся память освододится. Но, например, при завершении DLL, написанной с использованием VCL, она освободится с Runtime Error 216. Try..except не помогает, проверено :)

Это уже совсем другой вопрос. Я бы не рискнул назвать DLL процессом. Cовсем непонятно, что значит "завершение DLL"?


 
TButton   (2004-03-02 04:55) [19]

>Да, так-то оно так. Но предполагаю, каждый когда-нибудь нажимал
>ctrl-alt-del и возможно даже снимал какую-то задачу. Неужели
>при этом срабатывают все деструкторы всех объектов в т.ч. и
>CloseHandle и ReleaseDC. Конечно же - нет, при снятии задачи
>выполняется функция KillProcess. Давайте предположим, что все-
>таки при снятии задачи выполняются все деструкторы созданных
>объектов, тогда давно все бы кричали: «система
>работает "масдай" как медленно» т.к. даже не позволяет быстро
>снять бесполезный процесс. Что же происходит с ресурсами
>системы? Win9x не освобождает занятые ресурсы, а вот NT системы
>справляются с этим «на ура», не говоря о закрытии
>отрытых «убиваемым» процессом файлов, окон, display contexts и
>т.п. Отсюда Win95 иногда называют «масдай», что никогда не
>говорят об NT.

помнится открывал я паинтом БМПшку (маздай, кстати XPpro). такая себе БМПшка 5000х7000х2 метра на 4. весь вечер я матерился, поскоку паинт безбожно вис и никакой (!) ctrl+alt+del -> "завершить процесс" мне не помог, раза 4 комп ресетал... оттакая от загогулина
З.Ы, ресетал, потому что открыть все-таки надо было, в связи с этим приходилось идти на всякие ухищрения...


 
Внук   (2004-03-02 08:29) [20]

>>Defunct © (02.03.04 04:12) [18
>>Факт: проследить удаление абсолютно всех объектов в программе невозможно
Не факт. Например, MemProof и ряд других утилит.


 
Alex Konshin   (2004-03-02 08:36) [21]

Defunct © (02.03.04 04:12) [18]
Тебе нужно объяснять, что можно создать объект, который не будет удаляться ни при каком Ctrl+Alt+Del и ни в какой из Windows, даже NT?


 
KSergey   (2004-03-02 08:38) [22]

> [18] Defunct © (02.03.04 04:12)

Да.... Растет смена...

PS
А потом я глянул в анкету. Оказалось, про смену я загнул...
"Хобби: вирусописание и лечение в т.ч.
квалификация: магистр компьютерной инженерии."

Никогда нас вирусы не одолеют с таким подходом к их написанию! И это радует ;) Мы их контролальтделом всегда легко прибъем ;)


 
KSergey   (2004-03-02 08:39) [23]

Извините, конечно, но кроме как на личности перейти мне ничего на ум не пришло... Похоже, что доводы тут бесполезны, раз даже обстоятельнейший [14] Юрий Зотов © (02.03.04 01:41) не заставил задуматься.


 
Карелин Артем   (2004-03-02 08:48) [24]

Обьекты делай наследниками от TComponent к примеру. Будут освобождаться при освобождении владельца.


 
Тимохов   (2004-03-02 10:00) [25]


> Defunct © (02.03.04 04:12) [18]

Ну что вы опять упорствуете. Давно статус давателя парадоксальных ответов не подтверждали?


 
Verg   (2004-03-02 10:08) [26]

На сколько я понял, то речь идет про объекты заносимые в TStrings
AddObject(Str, Obj); - вот про эти

Т.е., когда мы делаем Delete(индекс), то никто не будет уничтожать привязанные к этому индексу объекты. Их нужно уничтожать самостоятельно. То же саме касается и clear.

С другой стороны в D6-то уже точно есть такая конструкция как TObjectList. Эта штука сама заботится о освобождении памяти.


 
Defunct   (2004-03-02 14:52) [27]

Alex Konshin © (02.03.04 08:36) [21]
> Тебе нужно объяснять, что можно создать объект, который не будет удаляться ни при каком Ctrl+Alt+Del и ни в какой из Windows, даже NT?

С равной или даже с более высокой вероятностью автор использует объекты, которые запросто и без последствуй будут удаляться вместе с разрушением процесса. Я просто в этом абсолютно уверен. Неужели нельзя дать право на существование такой простой истине как: раз ОС выделяет ресурсы под процесс, то она же их и забирает при разрушении процесса.

KSergey © (02.03.04 08:38) [22]
> Никогда нас вирусы не одолеют с таким подходом к их написанию! И это радует ;)

Не одолеют, т.к. авторы вирусов не ставят своей целью что-либо одолеть. Btw у вируса основная функция жить, а не разрушать.
К слову, на самом деле вирусы писать легче. Такой огромный кусок работы как обработку ошибок, можно частично предоставить ОС.

> Извините, конечно, но кроме как на личности перейти мне ничего на ум не пришло... Похоже, что доводы тут бесполезны, раз даже обстоятельнейший [14] Юрий Зотов © (02.03.04 01:41) не заставил задуматься.

Неправда, читайте [15].

PS: Иногда использование недокументированных функций ОС, гораздо приятней в использовании чем насаждаемые документированные правила. Да и спор непонятно о чем, если вы видите обстоятельные доводы только с одной стороны, той что вы привыкли сами делать, а альтернативные способы отбрасываете как ересь или просто не замечаете, то вопрос уже не к писателю, а к читателю.

Просто этот факт имеет место: при выходе из программы вся выделенная в процессе работы программы память освобождается. Воспользуетесь Вы им или нет, решать Вам взависимости от конкретной ситуации.

С уважением.


 
Игорь Шевченко   (2004-03-02 15:24) [28]


> Иногда использование недокументированных функций ОС, гораздо
> приятней в использовании чем насаждаемые документированные
> правила.


И программы после этого получаются непредсказуемые.

Обычно, целью написания программы является реализация некой функциональности, а не использование недокументированных функций вместо документированных.

---
LMD


 
Vuk   (2004-03-02 15:29) [29]

to Игорь Шевченко:
Тут ключевое слово - "приятнее". То есть это чисто психологическое - мол, вот какой я крутой, недокументированные функции использую...


 
Игорь Шевченко   (2004-03-02 15:47) [30]

Vuk © (02.03.04 15:29)


> мол, вот какой я крутой, недокументированные функции использую...


И на ассемблере пишу...


 
Юрий Зотов   (2004-03-02 15:50) [31]

> Defunct © (02.03.04 14:52) [27]

> С равной или даже с более высокой вероятностью автор
> использует объекты, которые запросто и без последствуй будут
> удаляться вместе с разрушением процесса. Я просто в этом
> абсолютно уверен.

Откуда же такая уверенность? Например, даже самый обычный TCanvas использует ресурсы GDI (шрифт, кисть, перо), об автоматическом освобождении хэндлов которых при завершении процесса нельзя говорить с полной уверенностью. А ведь TCanvas создается любым визуальным объектом. И, к тому же, мы знаем, что именно ресурсы GDI и есть наиболее критичны.

> Неужели нельзя дать право на существование такой простой
> истине как: раз ОС выделяет ресурсы под процесс, то она же их
> и забирает при разрушении процесса.

Нет, такой простой истине дать право на существование нельзя. Потому что она истиной не является. Например, точно известно, что при принудительном завершении процесса счетчик пользователей DLL не декрементируется. Результат - уже никем не используемая DLL может остаться невыгруженной и мы теряем память.


 
Вася Пупкин   (2004-03-02 15:54) [32]

Юрий Зотов © (02.03.04 15:50) [31]
http://delphimaster.net/view/7-1078081303/
А вот и пример....


 
Юрий Зотов   (2004-03-02 15:55) [33]

> Defunct © (02.03.04 14:52) [27]

> Просто этот факт имеет место: при выходе из программы вся
> выделенная в процессе работы программы память освобождается.

Память - да, освобождается. А другие ресурсы? Разве память - это единственный ресурс?

Например, Вы можете с полной уверенностью сказать, что система автоматически закрывает все хэндлы всех используемых в программе объектов? Регионов, например?


 
Defunct   (2004-03-02 15:57) [34]

Игорь Шевченко © (02.03.04 15:24) [28]

> И программы после этого получаются непредсказуемые.

Norton Utilities тому яркий пример.

> бычно, целью написания программы является реализация некой функциональности, а не использование недокументированных функций вместо документированных.

Выходит функциональность программы конкретно снизится, если вместо вызова деструктора, ОС очистит занятую программой память. Так?

Vuk © (02.03.04 15:29) [29]

"Проходил мимо, дай думаю ляпну чего, не читая всей ветки. Я же всегда вызывал все деструкторы, надо же оправдание этому какое-то придумать.", подумал Vuk.

Ключевое слово "проходил мимо", типа вон какой я крутой сразу сходу могу плюнуть на любой подход, который отличается от общепринятого.

Я знаком с Вашим мнением, согласен с ним, но просто говорю о том что есть и другие возможности. см. [15]. Не надо все перекручивать на свой лад.


 
Тимохов   (2004-03-02 16:00) [35]


> Defunct © (02.03.04 15:57) [34]

Ну и упертый же вы :))))


 
KSergey   (2004-03-02 16:02) [36]

> Defunct © (02.03.04 14:52) [27]
> Неправда, читайте [15].

> Defunct © (02.03.04 02:20) [15]
> Да, так-то оно так. Но предполагаю, каждый когда-нибудь
> нажимал ctrl-alt-del и возможно даже снимал какую-то задачу.

Если нормально завершить программу можно только так - извините, но это плохая программа. MS Excel завершается простым нажатием на "крестик". И после этого MS, разумеется, отстой.


 
Petr V. Abramov   (2004-03-02 16:04) [37]

Вот как поймают его пользователи вирусов, да побьют, упираться перестанет. А побьют не за то, что вирус "живет", а за то, что AV на выходе дает :)


 
Игорь Шевченко   (2004-03-02 16:06) [38]


> Norton Utilities тому яркий пример.


Очень яркий. На разных операционных системах ведет себя настолько по-разному, что я от них отказался еще в 1996 году.

> Выходит функциональность программы конкретно снизится, если
> вместо вызова деструктора, ОС очистит занятую программой
> память. Так?


Нет, функциональность не снизится. Но место такой программе в Recycle Bin. И только там. Вы не учитываете, что Windows - многозадачная система.


> Я же всегда вызывал все деструкторы, надо же оправдание
> этому какое-то придумать.


Грешен, но тоже всегда вызываю деструкторы.


 
Defunct   (2004-03-02 16:20) [39]

Petr V. Abramov © (02.03.04 16:04) [37]
;)
Ладно ладно, ухожу. А то и правда побъют за упрямство.

Юрий Зотов © (02.03.04 15:55) [33]

Например, Вы можете с полной уверенностью сказать, что система автоматически закрывает все хэндлы всех используемых в программе объектов? Регионов, например?

Terminating a process causes the following:

1.All of the object handles opened by the process are closed.
2.All of the threads in the process terminate their execution.
3.The state of the process object becomes signaled, satisfying any threads that had been waiting for the process to terminate.
4. The states of all threads of the process become signaled, satisfying any threads that had been waiting for the threads to terminate.
5. The termination status of the process changes from STILL_ACTIVE to the exit value of the process.

Нет уверенности только насчет DLL.


 
Игорь Шевченко   (2004-03-02 16:23) [40]


> 1.All of the object handles opened by the process are closed.
>


Это относится к объектам ядра (только они могут быть opened).


 
Vuk   (2004-03-02 16:25) [41]

to Defunct:
Хендлы - это мелочь по сравнению с тем случаем, если деструктор делает какую-то сложную работу по корректному завершению каких-либо операций, например, сброс буфера на диск и т.д.


 
panov   (2004-03-02 16:27) [42]

>Defunct © (02.03.04 16:20) [39]

Два простых примера:

1. Файл в состоянии записи.
2. Состояние записи в файловую БД с испольованием BDE.


 
Defunct   (2004-03-02 16:35) [43]

Vuk © (02.03.04 16:25) [41]
panov © (02.03.04 16:27) [42]

Абсолютно с Вами согласен, это как раз тот случай, когда объекты удалять обязательно.


 
Vuk   (2004-03-02 16:39) [44]

Так может это проще делать всегда?


 
YuRock   (2004-03-02 16:52) [45]

Небольшой комментарий:

Особенно красиво оставлять удаление объектов "на потом" при прорисовке окна :))



Страницы: 1 2 вся ветка

Форум: "Основная";
Текущий архив: 2004.03.14;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.67 MB
Время: 0.014 c
14-43809
Malkolinge
2004-02-23 12:24
2004.03.14
Profiler для Делфи


3-43324
Booza
2004-02-17 12:55
2004.03.14
DBGridEh и Samsung ML-1210


9-43241
mrz
2003-08-26 14:21
2004.03.14
Прозрачнуя текстура


1-43589
stud
2004-02-27 13:08
2004.03.14
вопрс про Quickrep.preview


6-43721
andruxin
2003-11-27 18:08
2004.03.14
InternetOpenUrl + HttpQueryInfo = :) ; FtpOpenFile + x =:(





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский