diff --git a/esphome/components/fan/fan.h b/esphome/components/fan/fan.h index 2b76fa24da..eff57a343a 100644 --- a/esphome/components/fan/fan.h +++ b/esphome/components/fan/fan.h @@ -132,15 +132,10 @@ class Fan : public EntityBase { /// Set the supported preset modes (stored on Fan, referenced by FanTraits via pointer). void set_supported_preset_modes(std::initializer_list preset_modes) { - if (!this->supported_preset_modes_) - this->supported_preset_modes_ = - new std::vector(); // NOLINT - intentional leak, entity lives forever - *this->supported_preset_modes_ = preset_modes; + this->ensure_preset_modes_().assign(preset_modes.begin(), preset_modes.end()); } void set_supported_preset_modes(const std::vector &preset_modes) { - if (!this->supported_preset_modes_) - this->supported_preset_modes_ = new std::vector(); // NOLINT - *this->supported_preset_modes_ = preset_modes; + this->ensure_preset_modes_() = preset_modes; } /// Set the restore mode of this fan. @@ -184,7 +179,14 @@ class Fan : public EntityBase { ESPPreferenceObject rtc_; FanRestoreMode restore_mode_; - /// Preset mode storage — allocated on first use, never freed (entity lives forever). + /// Lazy-allocate preset modes vector (never freed — entity lives forever). + std::vector &ensure_preset_modes_() { + if (!this->supported_preset_modes_) { + this->supported_preset_modes_ = new std::vector(); // NOLINT + } + return *this->supported_preset_modes_; + } + std::vector *supported_preset_modes_{nullptr}; private: