Brovin Yaroslav

[Статья] Жизненный цикл объектов в Delphi. Часть 1. Windows, OSX. Что же использовать Destroy, Free, FreeAndNil или DisposeOf?

В теме 18 сообщений

С появлением мобильных платформ в мире Delphi, произошли серьезные изменения в жизненном цикле объектов. Послужившие причиной многих проблем и вопросов, а как правильно кроссплатформенно удалять объекты. В этой статье детально рассматриваем жизненный цикл объектов на разных платформах и даём ответы на важные вопросы, которые могут побеспокоить даже опытных Delphi разработчиков.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

замечательная статья. и очень полезная, расставляющая все точки над i. спасибо. ждем продолжения для мобильных платформ )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо Ярослав за статью. Вы ответили на мой не заданный вопрос: как правильно в кросс-платформенной среде создавать и уничтожать экземпляры объектов, сохраняя единство кода для всех платформ.
У меня предложение - может быть выделить отдельную тему для подобных статей или вопросов назвав ее - правила хорошего кода. Ибо считаю важным для программиста выработку навыка корректного использования тех или иных методов, особенно тем, кто только начинает с пониманием почему нужно так.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
4 минуты назад, mixi сказал:

Спасибо Ярослав за статью. Вы ответили на мой не заданный вопрос: как правильно в кросс-платформенной среде создавать и уничтожать экземпляры объектов, сохраняя единство кода для всех платформ.
У меня предложение - может быть выделить отдельную тему для подобных статей или вопросов назвав ее - правила хорошего кода. Ибо считаю важным для программиста выработку навыка корректного использования тех или иных методов, особенно тем, кто только начинает с пониманием почему нужно так.

 

тут еще не совсем кроссплатформа, а только Вин и МакОС. мобильные платформы в следующей части и там есть нюансы

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо , большое за статью 。 Хотелось бы только уточнить,  правильно ли я понимаю, что  для многоплатформенных решении FreeAndNil не совсем правильная практика,  при разрушении объектов в на каких-то платформах  FreeAndNil просто обнуляет ссылки。 И для правильной работы автоматической системы подсчета ссылок  и гарантированного разрушения объекта лучше  использовать  DisposeOf  .Думаю это будет во второй части  но хотелось бы уточнить  чтобы меньше было правок в написанном коде :)

 

Изменено пользователем CodeToad

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 часа назад, CodeToad сказал:

Спасибо , большое за статью 。 Хотелось бы только уточнить,  правильно ли я понимаю, что  для многоплатформенных решении FreeAndNil не совсем правильная практика,  при разрушении объектов в на каких-то платформах  FreeAndNil просто обнуляет ссылки。 И для правильной работы автоматической системы подсчета ссылок  и гарантированного разрушения объекта лучше  использовать  DisposeOf  .Думаю это будет во второй части  но хотелось бы уточнить  чтобы меньше было правок в написанном коде :)

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
54 минуты назад, Равиль Зарипов (ZuBy) сказал:

 

Что значит в зависимости от типа c?

c[r] := nil; // Или FreeAndNil(c[r]), в зависимости от типа c.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
47 минут назад, GASCHE сказал:

Что значит в зависимости от типа c?

Если c - это объект и у него определен дефолтное свойство, то его нельзя передавать, как var параметр. Компилятор не соберет такой код.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо Ярослав!

Есть еще одна статья от GunSmoker на эту тему. Там есть ряд интересных ньюансов, которые не описаны у Ярослава и о которых многие не знают.

К примеру то, что DisposeOf хотя и вызывает деструктор, но не освобождает память выделенную под объект.. 

 

Изменено пользователем ENRGY

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за статью!

А под Android-ом как лучше удалять временно создаваемые фреймы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
52 минуты назад, Major сказал:

Спасибо за статью!

А под Android-ом как лучше удалять временно создаваемые фреймы?

Например, вот так:

Создаём фрейм

  FFrmSettings := TfrmSettings.Create(Self);
  FFrmSettings.Parent := Parent;

Уничтожаем фрейм

  if FFrmSettings <> nil then
  begin
    FFrmSettings.Parent := nil;
    FFrmSettings.DisposeOf;
    FFrmSettings := nil;
  end;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 06.03.2017 в 00:29, ENRGY сказал:

К примеру то, что DisposeOf хотя и вызывает деструктор, но не освобождает память выделенную под объект.. 

Это часть из ARC. Поэтому в этой статье этот метод не рассматривается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как быть с С++  - кругом в документации пишеться , что вместо Free необходимо использовать delete, но в андроиде delete не удаляет объект - тоже юзать FreeAndNil? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, antarey сказал:

А как быть с С++  - кругом в документации пишеться , что вместо Free необходимо использовать delete, но в андроиде delete не удаляет объект - тоже юзать FreeAndNil? 

в билдере есть умный указатель, unique_ptr, который сам чистит объекты которые больше никем не используются

Но это не точно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
33 минуты назад, Равиль Зарипов (ZuBy) сказал:

в билдере есть умный указатель, unique_ptr, который сам чистит объекты которые больше никем не используются

Но это не точно

Вот как раз об unique_ptr тоже вопрос, как умные указатели ведут себя на мобильных платформах? Для винды написано что объекты уничтожаются когда их никто не использует, или же когда объект выходит за пределы видимости - если я правильно понял - если объект локальный и внутри какого-то обработчика, то объект будет уничтожен по завершению обработчика.
Но как сие на практике и для винды и мобильных платформ - вопрос к Ярославу и Ембарсадеро

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата

Вот как раз об unique_ptr тоже вопрос, как умные указатели ведут себя на мобильных платформах?

Нормально ведет.
Начиная с 8:17 до 12:00 минуты видео:
*На слайде сказано: используйте unigue_ptr везде где возможно - Use unigue_ptr where possible.
*Не используйте new/delete

https://youtu.be/14w26ACHrII

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу