Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильн вызвать Destroy? [D7, XP]


Страницы:   1 2 3

Константин ©   (2010-04-02 15:00:00) 

Как правильно вызвать Destroy у объекта, который унаследован от TObjectList и в котором есть свойство Strings TStringList
Делаю так:
destructor Destroy;
....
destructor TOMyObjtct.Destroy;
begin
 Strings.Free;
 inherited;
end;
Не пойму. В таком варианте вроде работает, но непонятно как память освобождает. А вот если объявить деструктор как
destructor Destroy; override;
То в него заходит деббагер но ошибка на вызове деструктора предка!


Константин   (2010-04-06 10:25:00) [41]

Принципиально написал пример:
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Contnrs;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

 TA = class(TObjectList)
 public
   FStrings: TStringList;
   constructor Create(OwnsObjects: Boolean);
   procedure Clear; override;
   destructor Destroy; override;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

{ TA }

procedure TA.Clear;
begin
 inherited Clear;
 FStrings.Clear;
end;

constructor TA.Create(OwnsObjects: Boolean);
begin
 FStrings := TStringList.Create;
end;

destructor TA.Destroy;
begin
 FStrings.Free;
 inherited;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 a: TA;
begin
 a := TA.Create(True);
 a.Add(a);
 a.FStrings.Add('asdf');
 a.Free;
end;

end.


Давайте уважаемы, расскажите мне про FStrings и влияние наименования этого поля на ошибку доступа?


brother   (2010-04-06 05:28:00) [42]

> Принципиально спрошу

может не надо?


_Юрий   (2010-04-05 19:35:00) [43]


> я уже написал, что был перезаписан Clear и Destroy у TList
> не вызывался


Ну я тогда тоже принципиально спрошу - каким образом в данном примере неосвобождениепамяти могло привести к AV ?


Константин   (2010-04-05 17:43:00) [44]


> brother ©   (05.04.10 06:18) [13]

Принципиально спрошу, где не видно связи. Открой TObjectList и TList найдит там хот одно поле Strings, и посмотри на деструктор последнего. Мой код в первом посте.


brother   (2010-04-05 06:18:00) [45]

> Clear и Destroy у TList не вызывался

без кода - не вижу связи... + согласен с [3]


Константин   (2010-04-03 20:44:00) [46]

я уже написал, что был перезаписан Clear и Destroy у TList не вызывался


_Юрий   (2010-04-03 09:57:00) [47]

У тебя тут скорее всего было двойное разрушение
например, ты сам разрушил объект, который также входил в ObjectList был освобожден вместе с ним.


> destructor Destroy; override;


Если объявить его без override, это приведет например к тому, что при разрушении элемента, входящего в ObjectList, твой деструктор просто не будет вызван.


Константин   (2010-04-02 21:08:00) [48]

Anatoly Podgoretsky

> Ну я не подумал что в данном случае поле Strings может привести
> к конфликтам со свойствами TObjectList или TList
> ;)

Это прикол. Какой может быть Strings в TObjectList или TList?
Просто смысл выводить тут названия если можно просто объяснить псевдо-кодом?
Кстати и без destroy я не компилировал, а хинты и варнинги всегда смотрю!


Anatoly Podgoretsky   (2010-04-02 17:51:00) [49]

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


Константин   (2010-04-02 15:33:00) [50]


> Anatoly Podgoretsky ©   (02.04.10 15:20) [5]

это положительный отзыв?

> Anatoly Podgoretsky ©   (02.04.10 15:21) [6]

Ну я не подумал что в данном случае поле Strings может привести к конфликтам со свойствами TObjectList или TList
;)


Игорь Шевченко   (2010-04-02 15:24:00) [51]


> А вот если объявить деструктор как
> destructor Destroy; override;


так всегда надо объявлять


Anatoly Podgoretsky   (2010-04-02 15:21:00) [52]

> Константин  (02.04.2010 15:15:04)  [4]

А нафига нам обсуждать несуществующий код, вместо реального?


Anatoly Podgoretsky   (2010-04-02 15:20:00) [53]

> Константин  (02.04.2010 15:00:00)  [0]

Мы очень любим людей, которые говорят у меня ошибка


Константин   (2010-04-02 15:15:00) [54]


> Демо ©   (02.04.10 15:08) [3]

почти так и произошло, но пример был абстрактный, естественно в оригинале так нечиго неназывалось. Уже нашел - я переопределил Clear у TObjectList=>TList и поэтому в TList.Destroy  не ходило ))


Демо   (2010-04-02 15:08:00) [55]

Для начала замени Strings на FStrings, например, так как Strings в предке может использоваться.


Константин   (2010-04-02 15:06:00) [56]

на inherited; Access Violation ....


Омлет   (2010-04-02 15:01:00) [57]

какая ошибка?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо