Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Ошибка при уничтожении объекта


Автор: Keeper89 3.2.2010, 17:55
Доброго времени суток.

Создаю класс:
Код

  TProblem = class
  private
    FFunction: TObjectList<TFunction>;     // Список TFunction
    FLimitation: TObjectList<TLimitation>; // Список TLimitation
    FResults: TValues;
  public
    constructor Create;
    destructor Destroy; override;
    property Functions: TObjectList<TFunction> read FFunction write FFunction;
    property Limitations: TObjectList<TLimitation> read FLimitation write FLimitation;
  end;

constructor TProblem.Create;
begin
  inherited;
  FFunction := TObjectList<TFunction>.Create;
  FLimitation := TObjectList<TLimitation>.Create;
end;

destructor TProblem.Destroy;
begin
  FreeAndNil(FFunction); // Ошибка возникает здесь
  FreeAndNil(FLimitation);
end;


При уничтожении выдается ошибка:
Цитата

Project Project1.exe raised exception class EInvalidPointer with message 'Invalid pointer operation'.

Код

var
  myProblem: TProblem;
  myFunction: TFunction;
begin

  myProblem := TProblem.Create;
  try
    myFunction := TFunction.Create(exMin);
    try
      for i := 0 to mmo3.Lines.Count - 3 do
        myFunction.Add(StrToInt(mmo3.Lines[i]));
      ShowMessage(
                  Format('Count = %d | MaxIndex = %d | MaxItem = %d',
                         [myFunction.Count,
                          myFunction.MaxIndex,
                          myFunction.MaxItem])
                 );

      myProblem.Functions.Add(myFunction);
    finally
      FreeAndNil(myFunction);
    end;
  finally
    FreeAndNil(myProblem);
  end;

Что я делаю неправильно? smile

Автор: Qu1nt 3.2.2010, 20:30
FreeAndNil(myFunction);.

Автор: Keeper89 3.2.2010, 21:45
Qu1nt, тоже самое.

Автор: Shaggy 3.2.2010, 22:27
Hint:

TObjectList<T: class> = class(TList<T>)
    ...
    constructor Create(AOwnsObjects: Boolean = True); overload;

&

FreeAndNil(myFunction);

Автор: shmelina 6.2.2010, 23:06
В своем коде ты удаляешь и очищаешь локальную переменную:
Код

var
  myFunction: TFunction;
...
  FreeAndNil(myFunction)

Но в объекте TProblem в поле-списке Functions по прежнему храниться ссылка на тот объект. Вернее на мусор от него. И соответственно при попытке удалить Functions ты получаешь ошибку.

TObjectList при удалении удаляет все классы которые в нем находятся.

Тебе не нужно удалять FreeAndNil(myFunction), при удалении Problem этот объект удалиться.

Автор: Keeper89 6.2.2010, 23:59
ОК, всем спасибо, разобрался.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)