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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.093 c
2-1330858890
Zheksonz
2012-03-04 15:01
2013.03.22
Прерывание по изменению значения переменной.


2-1338573991
fShtein
2012-06-01 22:06
2013.03.22
EhLib компонент


15-1340601785
Oleg1
2012-06-25 09:23
2013.03.22
Начинающим


15-1339121462
Unk
2012-06-08 06:11
2013.03.22
Подскажите проигрыватель видео.


2-1330445134
Zheksonz
2012-02-28 20:05
2013.03.22
Почему может не срабатывать TGauge.Visible?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский