Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

FreeAndNil, пожалуйста, еще раз.   Найти похожие ветки 

 
Наивный   (2012-08-11 11:20) [0]

XE2, W7:
type
 TTestClass = class(TObject)
private
 Mem:Pointer;
public
 constructor Create;
 procedure   Free;
end;

constructor TTestClass.Create;
begin
 inherited Create;
 GetMem(Mem,1024);
end;

procedure TTestClass.Free;
begin
 FreeMem(Mem);
 inherited Free;
end;

var
 Obj:TTestClass;
begin
 Obj:=TTestClass.Create;
 FreeAndNil(Obj);               // !?
end.


Почему не происходит вызов TTestClass.Free
или как сделать правильно?


 
sniknik ©   (2012-08-11 11:46) [1]

> Почему не происходит вызов TTestClass.Free
потому как это простая, на виртуальная и т.д. процедура.

> или как сделать правильно?
перекрывать деструктор
destructor Destroy; override;


 
turbouser ©   (2012-08-11 12:08) [2]

Зачем такие извращения?


 
Наивный   (2012-08-11 12:15) [3]

Спасибо.

Получается, нужно освобождать ресурсы в своем перекрытом Destroy.?
Но тогда зачем же красноречивая процедура Free и рекомендации даже ее не использовать в коде непосредственно?


 
Наивный   (2012-08-11 12:17) [4]

> Зачем такие извращения?
это к FreeAndNil(Obj);
или к destructor Destroy; override;


 
turbouser ©   (2012-08-11 12:23) [5]


> это к FreeAndNil(Obj);

Free.
Много раз уже обсуждалось.


 
AV ©   (2012-08-11 13:29) [6]

procedure FreeAndNil(var Obj);
var
 Temp: TObject;
begin
 Temp := TObject(Obj);
 Pointer(Obj) := nil;
 Temp.Free;
end;

procedure TObject.Free;
begin
 if Self <> nil then
   Destroy;
end;


 
Наивный   (2012-08-11 14:33) [7]

> AV ©   (11.08.12 13:29) [6]
Да, я это видел, но у меня, наверное, пробел в понимании ООП, поскольку подумал, что Temp.Free; запустит вначале мой TTestClass.Free; в котором и будет дополнительная обработка ситуации когда Self=nil, - а уж потом я запущу inherited Free;, "фишка" которого в маскировании проблемы или вызове деструктора.

Думаю, если бы  FreeAndNil была такой:
procedure FreeAndNil(var Obj);
var
 Temp: TObject;
begin
 Temp:=InterlockedExchangePointer(Pointer(Obj),nil);
 if Temp<>nil then Temp.Destroy // !
 else                           // Ахтунг! Вы разрушаете вакуум!!!
end;

понимание и ценность ее использования была бы выше.

> turbouser ©   (11.08.12 12:23) [5]
>Free.
>Много раз уже обсуждалось.

Вот поэтому я и засомневался, но, спасибо, ненадолго. (теперь я сомневаюсь еще больше :))


 
turbouser ©   (2012-08-11 14:44) [8]


> Наивный   (11.08.12 14:33) [7]

Нет повода для сомнений.
Но если параноидально хочется удостовериться в освобождении ресурсов - освобождай вручную, никто не запрещает.


 
Давайте будем жрать!   (2012-08-11 15:43) [9]


> подумал, что Temp.Free; запустит вначале мой TTestClass.
> Free
Она о TTestClass.Free ничего не знает. Free — метод статический (и это хорошо), так что при вызове TObject(Obj).Free будет вызван Free именно из TObject. А уже из TObject.Free будет вызван правильный деструктор, который виртуальный.


 
Юрий Зотов ©   (2012-08-11 16:00) [10]

> Наивный   (11.08.12 14:33) [7]

> у меня, наверное, пробел в понимании ООП

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

> поскольку подумал, что Temp.Free; запустит вначале мой TTestClass.Free

Так было бы, если бы метод TObject.Free был виртуальным (или динамическим). А он статический, поэтому процедура Free вызывает TObject.Free, а не Ваш.


 
Наивный   (2012-08-11 16:36) [11]

[9],  [10] , да понемногу ситуация проясняется, спасибо.
А виртуальный/динамический - синонимы или есть различия?

[9]
> А уже из TObject.Free будет вызван правильный деструктор, который виртуальный.
Значит, правильно -  не использовать (совсем?) в своих классах Free, а переопределить деструктор?

[8]
> Но если параноидально хочется удостовериться в освобождении ресурсов
Нет-нет, но все-таки, что подразумевает >освобождай вручную ?


 
turbouser ©   (2012-08-11 16:40) [12]


> Наивный   (11.08.12 16:36) [11]


> Нет-нет

destroy
:=nil
etc


 
turbouser ©   (2012-08-11 16:41) [13]


> Наивный   (11.08.12 16:36) [11]
>
> [9],  [10] , да понемногу ситуация проясняется, спасибо.
>
> А виртуальный/динамический - синонимы или есть различия?
>
>

F1


 
Наивный   (2012-08-11 17:52) [14]

> turbouser ©   (11.08.12 16:41) [13]
>> А виртуальный/динамический - синонимы или есть различия?

>F1  -> Generally, use virtual methods. -> Ok.

О, а тут еще и class constructor, class destructor - буду осваивать.


 
Германн ©   (2012-08-12 02:25) [15]


> О, а тут еще и
> 1
>  
> class constructor, class destructor

А вот это самое главное в данном вопросе. Тут уже ясно сказано где создавать и где уничтожать.



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

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.054 c
15-1330357950
CRLF
2012-02-27 19:52
2013.03.22
А что такое "порты 2В/1Р"


6-1263679694
zSvetik
2010-01-17 01:08
2013.03.22
Открыл, нарезал, передал, склеил, показал видео


3-1281438304
12
2010-08-10 15:05
2013.03.22
Параметры в Oracle, ошибка ORA-01747


15-1343334602
Юрий
2012-07-27 00:30
2013.03.22
С днем рождения ! 27 июля 2012 пятница


2-1348400327
Jimmy
2012-09-23 15:38
2013.03.22
Изменение курсора мыши