Несмотря на отличное объяснение bummi того, почему Image1.Picture := nil
не приведет к утечке памяти, я обеспокоен тем, что это может вызвать красные флажки в умах новых людей, читающих мой код, поскольку его безопасность нелогична. Поэтому я хотел бы избежать этого. Какие существуют более интуитивно понятные альтернативы? Хотя ответ bummi был для Delphi, на самом деле меня больше интересует C++Builder.
Хотя установка TImage::Picture = NULL не приведет к утечке памяти, какие существуют альтернативы, которые могли бы избежать этой путаницы?
Ответы (4)
Альтернативой является использование Image->Picture->Assign(NULL);
, что на самом деле делает Image->Picture = NULL;
внутри.
Я установил Image1.Visible
на false
, чтобы изображение исчезло.
- Недостаток: вам придется восстановить
Visible
доtrue
, когда вы захотите отобразить следующее изображение. - Преимущество: если вам нужно отобразить одно конкретное изображение, но только в определенное время, то переключение «Видимый» может быть более эффективным, чем очистка и перезагрузка.
Если вы беспокоитесь, что читатель не поймет, что означает image.Picture := nil;
, и вы установили, что это самый простой способ очистить изображение, добавьте комментарий, указывающий, что делает установщик свойств.
Однако я не обязательно согласен с тем, что он вообще нуждается в каких-либо изменениях. Хорошо известно, что установщики свойств могут иметь побочные эффекты, и в Delphi нет соглашения о том, что после установки свойства в определенное значение повторное чтение этого свойства вернет то же самое значение. На самом деле, я подозреваю, что в VCL чаще встречаются свойства, которые не возвращают то же самое значение, которое было только что установлено.
В любом случае, комментарий или нет, я бы оставил задание с использованием nil
точно таким, какое оно есть.
Инкапсуляция присвоения свойств дает два преимущества:
- единственное место для документирования отсутствия утечек (DRY)
- менее тревожный интерфейс для использования в других местах
e.g.:
// Not a memory leak: see http://stackoverflow.com/a/23999207/782738
#define ClearImage(Image) Image->Picture = NULL
Image1.setPicture(NULL);
, тогда не было бы путаницы. - person M.M   schedule 24.08.2014