Хотя установка TImage::Picture = NULL не приведет к утечке памяти, какие существуют альтернативы, которые могли бы избежать этой путаницы?

Несмотря на отличное объяснение bummi того, почему Image1.Picture := nil не приведет к утечке памяти, я обеспокоен тем, что это может вызвать красные флажки в умах новых людей, читающих мой код, поскольку его безопасность нелогична. Поэтому я хотел бы избежать этого. Какие существуют более интуитивно понятные альтернативы? Хотя ответ bummi был для Delphi, на самом деле меня больше интересует C++Builder.


person Pete    schedule 24.08.2014    source источник
comment
Это общая проблема со свойствами: вы не знаете, какие хуки находятся на месте. Если бы синтаксис был Image1.setPicture(NULL);, тогда не было бы путаницы.   -  person M.M    schedule 24.08.2014


Ответы (4)


Альтернативой является использование Image->Picture->Assign(NULL);, что на самом деле делает Image->Picture = NULL; внутри.

person Remy Lebeau    schedule 28.08.2014

Я установил Image1.Visible на false, чтобы изображение исчезло.

  • Недостаток: вам придется восстановить Visible до true, когда вы захотите отобразить следующее изображение.
  • Преимущество: если вам нужно отобразить одно конкретное изображение, но только в определенное время, то переключение «Видимый» может быть более эффективным, чем очистка и перезагрузка.
person Pete    schedule 24.08.2014

Если вы беспокоитесь, что читатель не поймет, что означает image.Picture := nil;, и вы установили, что это самый простой способ очистить изображение, добавьте комментарий, указывающий, что делает установщик свойств.

Однако я не обязательно согласен с тем, что он вообще нуждается в каких-либо изменениях. Хорошо известно, что установщики свойств могут иметь побочные эффекты, и в Delphi нет соглашения о том, что после установки свойства в определенное значение повторное чтение этого свойства вернет то же самое значение. На самом деле, я подозреваю, что в VCL чаще встречаются свойства, которые не возвращают то же самое значение, которое было только что установлено.

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

person Community    schedule 24.08.2014

Инкапсуляция присвоения свойств дает два преимущества:

  1. единственное место для документирования отсутствия утечек (DRY)
  2. менее тревожный интерфейс для использования в других местах

e.g.:

// Not a memory leak: see http://stackoverflow.com/a/23999207/782738
#define ClearImage(Image) Image->Picture = NULL

person Pete    schedule 06.09.2014