Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Удаление объектов, освобождение памяти

Delphi , Компоненты и Классы , Классы

Удаление объектов, освобождение памяти



unit FreeForm;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  public
    destructor Destroy; override;
  private
    Button4: TButton;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
  B: TButton;
begin
  B := TButton.Create (self);
  B.Free;
  // Fix: B := nil;
  B.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  B1, B2: TButton;
begin
  // correct code
  B1 := TButton.Create (self);
  B2 := TButton.Create (B1); // B1 is the owner
  B2.Free;
  B1.Free;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  B1, B2: TButton;
begin
  // wrong code
  B1 := TButton.Create (self);
  B2 := TButton.Create (B1); // B1 is the owner
  B1.Free;
  B2.Free;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  // OK
  Button1.Free;
end;

destructor TForm1.Destroy;
begin
  Button2.Free; // OK
  inherited Destroy;
  Button3.Free; // OK
  Button4.Free; // Error!
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Button4 := TButton.Create (self);
end;

end.

Загрузить весь проект

Перейдём к каждому процедурному блоку: 1. Button1Click: создает новый объект TButton, присваивает его переменной B, а затем сразу же освобождает B. Это вызовет ошибку времени выполнения, потому что нельзя освободить объект, который не был создан еще. 2. Button2Click: правильно создает два объекта TButton, устанавливает владельца второго кнопки как первый (основной форм), а затем освобождает их в обратном порядке. Когда освобождается второй кнопка, она автоматически освободит ее ребенка (третью кнопку). Затем освобождается первая кнопка. 3. Button3Click: создает два объекта TButton, устанавливает владельца второго кнопки как первый (основной форм), но затем пытается освободить первую кнопку перед освобождением второй. Это вызовет ошибку времени выполнения, потому что нельзя освободить объект, который еще имеет детей. 4. FormDestroy: освобождает объект Button1, что правильно, потому что он не является владельцем другого контроля и должен быть освобожден в событии уничтожения формы. 5. Destroy: освобождает объект Button2, что также правильно, потому что он был создан на основной форме и должен быть освобожден, когда форма будет уничтожена. 6. Однако, при попытке освободить объект Button3 (который не существует), возникнет ошибка времени выполнения. 7. Также, пытаясь освободить несуществующий объект Button4, возникнет доступ к памяти.

Правильным способом управления циклом жизни этих объектов является: - Создавать их в событии создания формы (FormCreate) и устанавливать владельца соответственно. - Освобождать их в событии уничтожения формы (FormDestroy). - Если контролл создается динамически, освобождайте его как только закончите использовать.

В этом коде Button4 не нужен и должен быть удален. Процедура Button3Click неправильна, потому что она пытается освободить объект, который не существует, когда форма будет уничтожена. В исправленной версии кода:

procedure TForm1.FormCreate(Sender: TObject);
begin
  Button2 := TButton.Create(self);
end;

destructor TForm1.Destroy;
begin
  Button2.Free;
  inherited Destroy;
end;

В этой исправленной версии Button2 создается в событии создания формы и освобождается в событии уничтожения формы. Это обеспечивает, что все объекты правильно управляются, и память освобождается, когда она больше не нужна.

В статье рассматриваются вопросы удаления объектов и освобождения памяти в программировании на языке Pascal, с использованием примеров на основе Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Классы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:52:08/0.0055758953094482/1