std::map<int,struct> 中的结构内存泄漏?

Structs in std::map<int,struct> memory leaking?

我有以下结构和映射

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++ 自动释放 space? (我知道这听起来像是垃圾回收,但我不知道 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()
            };
}

让我们分解示例 1 中发生的情况(完成此任务的正确方法)

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()
        };

        {
            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()
        };

创建并初始化一个临时 dataStruct 变量,这是一个自动变量,只有在不再需要它时才会存在。当表达式结束时,临时对象超出范围并被销毁。

uuidData[uuid]

uuidData 中查找匹配 uuid 的键。如果找不到,它会创建一个空的 dataStruct 并将其映射到密钥。这个新 dataStructuuidData 管理。它从哪里来,到哪里去,与你无关。一旦映射到 uuiddataStruct 存在,就会返回对它的引用。

现在我们有对地图中现有 dataStruct 和临时 dataStruct 的引用。 = 只是简单地将右侧临时对象的内容复制到左侧引用所代表的对象中。左侧对象中的任何内容都被覆盖,但该对象仍然存在并且仍由 uuidData 管理。当它从 uuidData 中删除或 uuidData 超出范围时,它将被正确销毁和释放。当表达式完成时,临时文件会自动销毁 (ergo the name Automatic variable)。

这里不可能有泄密的可能。