【发布时间】:2021-10-08 20:42:47
【问题描述】:
我有以下结构和映射
struct dataStruct{
unsigned long time;
int32_t ch0;
int32_t ch1;
uint8_t state;
int16_t temp;
uint16_t vbat;
int8_t rssi;
};
std::map<uint32_t,struct dataStruct> uuidData = {};
还有一个循环等待新数据并用它填充地图。 (1)
for(;;)
{
if (data_debug.is_new_data_available())
{
uint32_t uuid = data_debug.get_ID();
uuidData[uuid] = {
millis(),
data_debug.get_data1(),
data_debug.get_data2(),
data_debug.get_state(),
data_debug.get_temperature(),
data_debug.get_battery_level(),
data_debug.get_RSSI()
};
}
}
这可行,但是当我使用现有 UUID 获取数据时,我的直觉是旧结构永远不会被删除并且最终会泄漏。
我在下面有一个替代代码 (2) 试图绕过这个,但是当 UUID 被复制时,结构被垃圾填充。 (1) 中的代码是否泄漏或 c++ 在不再需要该结构时自动释放空间? (我知道这听起来像是垃圾回收,但我不知道 c++ 如何处理结构)
(2)
if(uuidData.count(uuid)){
uuidData[uuid].time = millis();
uuidData[uuid].ch0 = data_debug.get_data1();
uuidData[uuid].ch1 = data_debug.get_data2();
uuidData[uuid].state = data_debug.get_state();
uuidData[uuid].temp = data_debug.get_temperature();
uuidData[uuid].vbat = data_debug.get_battery_level();
uuidData[uuid].time = data_debug.get_RSSI();
}
else{
uuidData[uuid] = {
millis(),
data_debug.get_data1(),
data_debug.get_data2(),
data_debug.get_state(),
data_debug.get_temperature(),
data_debug.get_battery_level(),
data_debug.get_RSSI()
};
}
【问题讨论】:
-
如果
uuid存在,它会被重用。uuidData[uuid] = { ... };将{ ... }创建的临时对象复制到map中的现有对象中。当uuid被删除或地图超出范围时,map将处理对象的正确销毁和释放。 -
为什么你的直觉是旧结构永远不会被删除?
-
@NathanPierson 因为我从来没有明确地调用过删除。
-
只有
delete你new。如果您的代码没有new,则不需要delete。 -
次要注意:由于您使用的是 C++ 而不是 C,因此无需编写
std::map<uint32_t,struct dataStruct>。您可以将其简化为std::map<uint32_t, dataStruct>。