diff --git a/esphome/components/mdns/mdns_component.cpp b/esphome/components/mdns/mdns_component.cpp index fea3ced99f..7b36fce229 100644 --- a/esphome/components/mdns/mdns_component.cpp +++ b/esphome/components/mdns/mdns_component.cpp @@ -83,7 +83,7 @@ void MDNSComponent::compile_records_(StaticVectorservices_ = services; + // Move to member variable if storage is enabled (verbose logging, OpenThread, or extra services) + this->services_ = std::move(services); #endif } diff --git a/esphome/components/mdns/mdns_component.h b/esphome/components/mdns/mdns_component.h index 62476e9504..35371fd739 100644 --- a/esphome/components/mdns/mdns_component.h +++ b/esphome/components/mdns/mdns_component.h @@ -38,7 +38,7 @@ struct MDNSService { // as defined in RFC6763 Section 7, like "_tcp" or "_udp" const MDNSString *proto; TemplatableValue port; - std::vector txt_records; + FixedVector txt_records; }; class MDNSComponent : public Component { diff --git a/esphome/core/helpers.h b/esphome/core/helpers.h index fd6b3eb52f..6cc0e4440e 100644 --- a/esphome/core/helpers.h +++ b/esphome/core/helpers.h @@ -200,6 +200,15 @@ template class FixedVector { public: FixedVector() = default; + /// Constructor from initializer list - allocates exact size needed + /// This enables brace initialization: FixedVector v = {1, 2, 3}; + FixedVector(std::initializer_list init) { + init(init.size()); + for (const auto &item : init) { + push_back(item); + } + } + ~FixedVector() { cleanup_(); } // Disable copy operations (avoid accidental expensive copies)