Самоубийство

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Самоубийство

Сообщение Tango » 27.02.2015 13:25:14

Вопрос с подвохом.

Можно ли объекту из себя прибить себя или же поручив это господину, но вызвав его метод из себя же, а затем вернувшись в себя, зомби.

Кто ничего не понял, может посмотреть код тут https://github.com/Tango600/dcl5/blob/master/src/uUDL.pas.
убивается объект TDCLForm, при закрытии формы, убивает его TDCLLogOn. На выходе из метода TDCLLogOn.CloseForm получаю SIGSEV.

Как правильно убить объект.
Аватара пользователя
Tango
постоялец
 
Сообщения: 162
Зарегистрирован: 31.05.2012 17:07:30

Re: Самоубийство

Сообщение alexs » 27.02.2015 13:36:12

Код: Выделить всё
      Application.ReleaseComponent(T);

Именно для этого и предназначено.

PS
Ну и тема... Ещё связисты забанят.... :D
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Самоубийство

Сообщение Дож » 27.02.2015 13:41:35

Можно ли объекту из себя прибить себя или же поручив это господину, но вызвав его метод из себя же, а затем вернувшись в себя, зомби.

Конечно, можно.
Код: Выделить всё
[doj@larion ~/temp]$ cat selfkill.pas
type
TMyObject = class
public
  X: LongInt;
  procedure Action;
end;

procedure TMyObject.Action;
begin
  X := 5;
  Writeln('INSIDE ', X);
  Free;
  Writeln('OUTSIDE');
end;

var
  A: TMyObject;

begin
  A := TMyObject.Create;
  A.Action;
end.
[doj@larion ~/temp]$ fpc -Mdelphi selfkill.pas && ./selfkill
/usr/bin/ld: warning: link.res contains output sections; did you forget -T?
INSIDE 5
OUTSIDE
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Самоубийство

Сообщение Tango » 27.02.2015 13:55:52

Дож, вижу, что тогда я делаю не так?
И главное как? Как после Free вызывается ещё что то?
И как отловить SIGSEV?
Аватара пользователя
Tango
постоялец
 
Сообщения: 162
Зарегистрирован: 31.05.2012 17:07:30

Re: Самоубийство

Сообщение NTFS » 27.02.2015 14:17:52

Я бы не стал так делать на Pascal. Слишком велик риск, что рано или поздно, в цепочке методов, управление вернется к черту на рога и система посыпется.
Если нужно удалить объект по его собственной инициативе - лучше использовать исключение из списка без вызова Free. Например, если нужно убрать объект из коллекции родителя, то используем TObjectList.Extract вместо TObjectList.Delete. И память цела, и объект уходит. Да, немного подтекает, но для мелких программ уровня пользователя это некритично, а драйвера/ядра/службы на ООП обычно не делают.
Удачи.
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Re: Самоубийство

Сообщение Дож » 27.02.2015 14:27:51

Tango писал(а):Дож, вижу, что тогда я делаю не так?
И главное как? Как после Free вызывается ещё что то?

Я не знаю, я не ориентируюсь в этих 17к строках. В какой строке происходит вызов этого самого Free?

Обычно освобождение делают не сразу внутри всяких обработчиков, как только решили удалить объект, а откладывают удаление на потом и уже в спокойной обстановке где-то в стороне удаляют то, что нужно. Разумеется, если удалить объект и не наложить никакого ограничения на код далее по времени — можно словить AV.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Самоубийство

Сообщение NTFS » 27.02.2015 15:21:35

AV - фигня, удаляя объекты в неположенном месте, можно словить такую ошибку, что пробивает все try..except и валит ваше прекрасное приложение на глазах у клиента.
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Re: Самоубийство

Сообщение Tango » 27.02.2015 15:26:41

А у меня это делает другой объект, вот и запарывается.
Аватара пользователя
Tango
постоялец
 
Сообщения: 162
Зарегистрирован: 31.05.2012 17:07:30

Re: Самоубийство

Сообщение Дож » 27.02.2015 15:31:20

NTFS писал(а):AV - фигня, удаляя объекты в неположенном месте, можно словить такую ошибку, что пробивает все try..except и валит ваше прекрасное приложение на глазах у клиента.

AV — это и есть такая ошибка.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Самоубийство

Сообщение Лекс Айрин » 27.02.2015 16:17:39

Не проще ли поставить в объекте переменную, которая просто отмечает объект удаленным?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Самоубийство

Сообщение stanilar » 02.03.2015 18:45:11

Tango писал(а):убивается объект TDCLForm


Форма это не просто объект, а объект для работы с окнами. При его удалении могут работать разные алгоритмы, в том числе send/post message. Поэтому даже если форме сделать Free не из собственного метода, можно словить AV.

На дельфях лучше делать как-то так:

Код: Выделить всё
procedure TMyForm.OnClose(Action : TAction);
begin
  Action := caFree;
end;

procedyre TMyForm.MyFree;
begin
  Close;
end;


Tango писал(а):как отловить SIGSEV?


А чего его ловить? Другой вопрос что он возникает во внутренней кухне LCL, при обращении к удаленной форме.

Добавлено спустя 5 часов 38 минут 34 секунды:
В общем случае не надо пользоваться стандартными методами создания/удаления специализированных объектов. У специализированных объектов часто есть свои, специализированные, функции создания/удаления.

То, что у TForm можно вызвать Create/Destroy - ну это надо похвалить прямые руки разработчиков. В общем случае это не всегда так.
stanilar
постоялец
 
Сообщения: 289
Зарегистрирован: 09.03.2010 19:09:02


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19

Рейтинг@Mail.ru