return string when building protocol ids - avoid unused pointers

This commit is contained in:
Nicu Hodos 2024-05-16 10:26:15 +02:00
parent b5e13c9ba2
commit 77594581ff
5 changed files with 13 additions and 21 deletions

View File

@ -27,10 +27,9 @@ public:
rcSwitch["raw_value"] = value;
}
static char* buildId(const char* group, const unsigned char channel) {
char* uId = new char[30];
static std::string buildId(const char* group, const unsigned char channel) {
char uId[30];
sprintf(uId, "%s_%d", group, channel);
return uId;
return std::string{ uId };
}
};

View File

@ -33,16 +33,4 @@ public:
}
}
static char* buildId(const char* id) {
char* uId = new char[30];
sprintf(uId, "%s", id);
return uId;
}
static char* buildId(unsigned int id) {
char* uId = new char[30];
sprintf(uId, "%d", id);
return uId;
}
};

View File

@ -55,7 +55,13 @@ struct PollinSwitch : Switch {
unsigned char channel;
PollinSwitch(const char* name, const char* group, const unsigned char channel, const char* area = nullptr)
: Switch(name, Protocol_1::buildId(group, channel)), group(group), channel(channel) {
: Switch(name, [group, channel]{
// copy id from string into a new pointer, to avoid memory leaks
string s = Protocol_1::buildId(group, channel);
char* uId = new char[s.length() + 1];
strcpy(uId, s.c_str());
return uId;
}()), group(group), channel(channel) {
mainDevice = (new DeviceConfig{id})->withName(name)->withManufacturer("Pollin")->withArea(area)->withParent(gatewayDevice);
deviceClass = "outlet";
p1Switches.insert({ string(id), this });

View File

@ -233,11 +233,11 @@ namespace Ha {
const char* unitMeasure = nullptr;
const char* valueTemplate = nullptr;
Sensor() : Component(name, Protocol_2::buildId(id), "sensor") {
Sensor() : Component(name, id, "sensor") {
withStateTopic();
}
Sensor(const char* name, const char* id) : Component(name, Protocol_2::buildId(id), "sensor") {
Sensor(const char* name, const char* id) : Component(name, id, "sensor") {
withStateTopic();
}

View File

@ -56,7 +56,6 @@ namespace Board {
JsonObjectConst rcSwitch = jsonDoc["rcSwitch"];
switch ((unsigned int)rcSwitch["protocol"]) {
case 1: {
// buildId returns a new pointer, should it be deleted, or string will take care of it?
string id = Protocol_1::buildId((const char*)rcSwitch["group"], (int)rcSwitch["channel"]);
Ha::Switch* el = p1Switches[id];
if (el != nullptr) {
@ -81,7 +80,7 @@ namespace Board {
}
if (jsonDoc.containsKey("sensor")) {
JsonObjectConst json = jsonDoc["sensor"];
string id = Protocol_2::buildId((unsigned int)json["id"]);
string id = to_string((unsigned int)json["id"]);
char stateTopic[TOPIC_SIZE];
sprintf(stateTopic, "homeassistant/sensor/%s/%s/state", MAIN_DEVICE_ID, id.c_str());
Mqtt::publish(stateTopic, message);