Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.07.2006 (Пт) 19:49

Вновь нужна помощь.

В функции есть локальная переменная-объект. Как кошернее всего её убить перед выходом?
Сейчас написал:
Код: Выделить всё
procedure foo; var bar: TMyObject; begin bar := nil; try
//
// здесь страница кода ;-)
//
finally if Assigned(bar) then bar.Destroy end end;
Но мне кажется, что это безбожно криво, и должен быть способ лучше.
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.07.2006 (Пт) 21:30

http://info.borland.com/techpubs/delphi/index.html писал(а):Components on a form are created and destroyed automatically. However, if you write your own code to instantiate objects, you are responsible for disposing of them as well. Every object inherits a Destroy method (called a destructor) from TObject. To destroy an object, however, you should call the Free method (also inherited from TObject), because Free checks for a nil reference before calling Destroy. For example,
Код: Выделить всё
Employee.Free;
destroys the Employee object and deallocates its memory.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.07.2006 (Пт) 21:46

А я хочу, чтобы как в C++ и других нормальных языках: при выходе из функции все её локальные объекты сами убивались.
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.07.2006 (Пт) 21:53

Дык это.
Ты объект создаёшь как?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.07.2006 (Пт) 21:54

Конструктором, вестимо. А как ещё можно?
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.07.2006 (Пт) 21:58

Ну т.е. :=Object.Create ты делаешь?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.07.2006 (Пт) 22:28

:=TMyObject.Create делаю. (А разве как-то ещё можно?)
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.07.2006 (Пт) 22:38

Вот... а раз делаешь, то разве не логично делать и free?..
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.07.2006 (Пт) 22:51

Не логично, потому что привык, что за мной автоматически убирают мусор :-)

Зачем-то ведь делфи обрамляет каждую функцию SEH-кадром. Что она в нём делает? я раньше думал, что как раз прибивает объекты; а оказалось, нет :-(
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.07.2006 (Пт) 23:22

пишут:
it's a typical requirement of C- and VB-programmers to Delphi, that garbage collection should happen automatically. But why should it? A local object-variable doesn't always have to hold a seperate instance.

Блин :evil:

Рядом пишут, что эта фича у них в вишлисте со времён 4-й версии.
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.07.2006 (Пт) 23:31

Гы гы, а больше дельфей не будет :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.07.2006 (Сб) 10:00

Из хелпа к моим шестым делфям:

Interface references are managed through reference-counting, which depends on the _AddRef and _Release methods inherited from IInterface. When an object is referenced only through interfaces, there is no need to destroy it manually; the object is automatically destroyed when the last reference to it goes out of scope.


Проверяю: ничего подобного.
Код: Выделить всё
program Project1;

{$APPTYPE CONSOLE}

type
  IPoorLittleObject = interface
    procedure Bleep;
  end;

  TPoorLittleObject = class(TInterfacedObject,IPoorLittleObject)
    procedure AfterConstruction; override;
    procedure BeforeDestruction; override;
    procedure Bleep;
  end;
procedure TPoorLittleObject.AfterConstruction;
begin writeln('PoorLittleObject.AfterConstruction') end;
procedure TPoorLittleObject.BeforeDestruction;
begin writeln('PoorLittleObject.BeforeDestruction') end;
procedure TPoorLittleObject.Bleep;
begin writeln('PoorLittleObject.Bleep') end;

procedure TormentObject; var v: IPoorLittleObject;
begin v := TPoorLittleObject.Create; v.Bleep end;

begin
  try TormentObject except end;
end.

WTF? :evil: :evil:
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.07.2006 (Сб) 15:37

Дельфей нет проверить...
Дык IInterface - он же из automation там, нет?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.08.2006 (Пт) 13:28

tyomitch писал(а):Из хелпа к моим шестым делфям:

...

Проверяю: ничего подобного.

...

WTF? :evil: :evil:

Оказалось, что нехватало inherited в AfterConstruction; если его добавить, код работает.
Блин.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.08.2006 (Пт) 17:58

Нет, всё-таки подсчёт ссылок -- великая вещь.
Сегодня весь день дебажил прогу, в которой уничтожались объекты, на которые оставались ссылки в локальных переменных процедур.
В итоге перед каждым обращением к объекту нужно как-то узнавать, он ещё живой или уже нет.
Самое милое -- это когда уничтожают объект, у которого есть выполняющиеся методы. В итоге self в них указывает на мусор, и все (явные или неявные) обращения к собственным полям приводят к ошибке в противоположном конце проги, где будет использоваться прочитанный оттуда мусор.
COM -- это рулез :-)
Изображение

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 04.08.2006 (Пт) 19:15

.NET - рулез. Сборщик прибьёт только то что нужно.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.08.2006 (Пт) 19:37

.net -- это другая крайность: когда объект уже сто лет никому не нужен, и всё равно никак не помрёт.
Изображение


Вернуться в Народный треп

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

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

    TopList