@andreloster

Очищение памяти, занимаемой свойствами класса, при закрытии формы?

Приветствую.

Изучаю делфи и наткнулся на такую задачку: нужно очистить память, занимаемую свойствами экземпляра класса при закрытии формы.

Реализация такая (названия, естественно, выдуманные):

unit Unit1;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ExtDlgs, ComCtrls;

type
  TForm1 = class(TForm)
    ...
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  end;

  MyClass = class
    St_L1, St_L2: TStringList;
    constructor Create();
  end;

  MainClass = class
    MyStrings: MyClass;
    ...
    procedure CreateMyClass();
  end;

var
  MC: MainClass;

implementation

{$R *.dfm}

constructor MyClass.Create();
begin
  St_L1 := TStringList.Create;
  St_L2 := TStringList.Create;
end;

destructor MyClass.Destroy();
begin
  St_L2 .Free;
  St_L2 .Free;
end;

procedure MainClass.CreateMyClass();
begin
  MyStrings := MyClass.Create();
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  MC.CreateMyClass();
end;

// ...

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  MC.Destroy();
end;

end.


Есть смысл вообще писать деструктор для MyClass, если я экземпляр MC в конце уничтожаю => память, занимаемая двумя TStringList-ами, автоматом очищается в принципе? Если есть придирки к реализации, то прошу их вынести на всеобщее обозрение, так как учусь.

P.S. Такая реализация была выбрана из-за того, что хочу делать обращения к свойствам и методам моих дочерних классов через свой главный, "глобальный" класс (в данном случае, это MainClass)

Спасибо.

UPDATE продолжение 4-го вопроса

type
    Books = class
        Title: String;
        Author: String;
        PublYear: Integer;
        constructor Create(Title: String; Author: String; PublYear: Integer);
    end;
    
    Library = class
        Book: array [1..100] of Books;
        Counter;
        constructor Create();
        procedure AddBook(T: String; A: String; PY: Integer);
        function GetBookTitle(N: Integer): String;
    end;

constructor Create(Title: String; Author: String; PublYear: Integer);
begin
    self.Title := Title;
    self.Author := Author;
    self.PublYear := PublYear;
end;

constructor Library.Create();
begin
    Counter := 0;
end;

procedure Library.AddBook(T: String; A: String; PY: Integer);
begin
    Counter := Counter + 1;
    Book[Counter] := Books.Create(T, A, PY);
end;

function GetBookTitle(N: Integer): String;
begin
    Result := Book[N].Title;
end;

var
    LB: Library;

begin

    LB := Library.Create();
    LB.AddBook('Утиные истории', 'Дональд Дак', 2999);

    ShowMessage(LB.GetBookTitle(1));

end.
  • Вопрос задан
  • 2758 просмотров
Решения вопроса 1
@M_PRO
1. МС - не инициализирован.
То есть где-то ещё должно появиться:
MC := MainClass.Create;
В противном случае поведение программы не предсказуемо.

2. Никакого авто-удаления тут не будет. Если Вы в явном виде не удалили TStringList-ы, они так и останутся в памяти (что логично, потому что, например, Вы могли передать их в другие объекты). Отсюда следует, что FList типа TStringItemList (который по сути своей динамический массив) и все строки который в них хранятся останутся в памяти на веки вечные.

3. Если Вам интересно есть ли Вашей программе утечки памяти воспользуйтесь
reportmemoryleaksonshutdown := true;
Про подробности подскажет Google.

4. Про реализацию с глобальным классом - я не совсем понял технику, но выглядит она очень спорной.

5. MC.Destroy - лучше заменить на FreeAndNil(MC), но всё равно, нужно написать
TMainClass = class(TObject)
  ...
  destructor Destroy; override;
end;

...

destructor TMainClass.Destroy;
begin
  MyStrings.Free;
end;


6. Создание подобъекта процедурой CreateMyClass лучше перенести в конструктов "главного класса".
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы