![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильн вызвать Destroy? [D7, XP]
Константин © (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]какая ошибка?