Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Нет ли утечки памяти / 8 сообщений из 8, страница 1 из 1
17.08.2021, 20:45
    #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
17.08.2021, 20:56
    #40091339
asviridenkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нет ли утечки памяти
wsnet,

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

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

Если объект приходит из GetMyObject, то по завершении работы его следует отдать с помощью PutMyObject.
...
Рейтинг: 0 / 0
18.08.2021, 05:41
    #40091380
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нет ли утечки памяти
softwarer, а можно поподробнее применительно к коду моему как это сделать?
...
Рейтинг: 0 / 0
18.08.2021, 06:12
    #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
18.08.2021, 11:22
    #40091424
s62
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
18.08.2021, 13:50
    #40091485
s62
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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Нет ли утечки памяти / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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