powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Нет ли утечки памяти
8 сообщений из 8, страница 1 из 1
Нет ли утечки памяти
    #40091337
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, не совсем понимаю, не будет ли в приведённом ниже коде утечки памяти и следует ли удалять объект FMyObject?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
  TMyObject = class
...

 TMyForm = class(TForm)
   FMyObject: TMyObject;

class function Execute: Boolean;
procedure Init(AMyObject: TMyObject);

implementation

class function TMyForm.Execute: Boolean;
var
  Form: TMyForm;
  MyObject: TMyObject;
begin
  Form := TMyForm.Create(nil);
  try
    if УСЛОВИЕ then
    begin
      MyObject := GetMyObject;
      Form.Init(MyObject);
    end;
    Result := Form.ShowModal = mrOk;
  finally
    FreeAndNil(Form);
  end;
end;

procedure TMyForm. Init(AMyObject: TMyObject);
begin
  FMyObject := AMyObject;
end;
...
Рейтинг: 0 / 0
Нет ли утечки памяти
    #40091339
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

На этот вопрос может ответить только функция getMyObject
...
Рейтинг: 0 / 0
Нет ли утечки памяти
    #40091344
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

при удалении (освобождении) формы, она автоматически удалит все компоненты, владельцем (owner) которых является. Объект, который (ссылка на объект) является полем формы, если это не компонент, владельцем которого является форма, автоматически не удалится, так что нужно его удалить, чтобы освободить память.
...
Рейтинг: 0 / 0
Нет ли утечки памяти
    #40091350
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
Добрый день, не совсем понимаю, не будет ли в приведённом ниже коде утечки памяти и следует ли удалять объект FMyObject?

Если объект приходит из GetMyObject, то по завершении работы его следует отдать с помощью PutMyObject.
...
Рейтинг: 0 / 0
Нет ли утечки памяти
    #40091380
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer, а можно поподробнее применительно к коду моему как это сделать?
...
Рейтинг: 0 / 0
Нет ли утечки памяти
    #40091381
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если удалю MyObject таким образом это будет корректно, а в конструкторе формы предварительно nil присвою объекту? (в GetMyObject создается экземпляр класса просто через Create).

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
  TMyObject = class
...

 TMyForm = class(TForm)
   FMyObject: TMyObject;

class function Execute: Boolean;
procedure Init(AMyObject: TMyObject);
constructor Create(AOwner: TComponent); override;

implementation

class function TMyForm.Execute: Boolean;
var
  Form: TMyForm;
  MyObject: TMyObject;
begin
  Form := TMyForm.Create(nil);
  try
    if УСЛОВИЕ then
    begin
      MyObject := GetMyObject;
      Form.Init(MyObject);
    end;
    Result := Form.ShowModal = mrOk;
  finally
    if Assigned(MyObject) then
      FreeAndNil(MyObject);

   FreeAndNil(Form);
  end;
end;

procedure TMyForm.Init(AMyObject: TMyObject);
begin
  FMyObject := AMyObject;
end;

constructor TMyForm.Create(AOwner: TComponent);
begin
  inherited;
   FMyObject := nil;  
end;
...
Рейтинг: 0 / 0
Нет ли утечки памяти
    #40091424
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

wsnetа в конструкторе формы предварительно nil присвою объекту? Это не нужно делать.
Конструктор это и так делает.
ЭмбаркадероThis allocates storage for the new object, sets the values of all ordinal fields to zero, assigns nil to all pointer and class-type fields , and makes all string fields empty.
http://docwiki.embarcadero.com/RADStudio/Sydney/en/Methods_(Delphi)#Constructors

wsnet
Код: pascal
1.
2.
   if Assigned(MyObject) then
      FreeAndNil(MyObject);


Проверка не нужна, она и так делается в коде FreeAndNil, посмотрите реализацию FreeAndNil и вызываемой ею Free.

Совет, почитайте какой-нибудь учебник. Видно, что у вас есть пробелы знаний насчёт базовых вещей. Если прочитать какой-нибудь учебник, то можно сразу много пробелов в знаниях закрыть. Например, старая, но во многом не устаревшая книжка "Стив Тейксейра, Ксавье Пачеко - Delphi 5. Руководство разработчика." - "Том 1. Основные методы и технологии программирования".
...
Рейтинг: 0 / 0
Нет ли утечки памяти
    #40091485
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

1) у вас 2 переменные ссылаются на один и тот же объект. Зачем это? На мой взгляд это не нужно, уберите локальную переменную MyObject, оставьте только поле формы.
2) Смотрите, вы создаете форму, а потом, сразу после создания, проверяете некое условие. Там, где вы будете вызывать в коде TMyForm.Execute, не будет видно, что это условие используется, соответственно, часть логики кода скрыта, неочевидна. Передавайте это условие, если это удобно, как параметр функции, чтобы это было явно. Например вот так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
  TMyObject = class
...

 TMyForm = class(TForm)
   FMyObject: TMyObject;

class function Execute(aUslovie: boolean): Boolean;
destructor Destroy; override;
...

implementation

class function TMyForm.Execute(aUslovie: boolean): Boolean;
var
  Form: TMyForm;
begin
  Form := TMyForm.Create(Application);
  try
    if aUslovie
    then Form.FMyObject := GetMyObject;
    Result := Form.ShowModal = mrOk;
  finally
    FreeAndNil(Form);
  end;
end;

destructor TMyForm.Destroy;
begin
  FMyObject.Free;
  inherited;  
end;
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Нет ли утечки памяти
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]