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
并将其映射到密钥。这个新 dataStruct
由 uuidData
管理。它从哪里来,到哪里去,与你无关。一旦映射到 uuid
的 dataStruct
存在,就会返回对它的引用。
现在我们有对地图中现有 dataStruct
和临时 dataStruct
的引用。 =
只是简单地将右侧临时对象的内容复制到左侧引用所代表的对象中。左侧对象中的任何内容都被覆盖,但该对象仍然存在并且仍由 uuidData
管理。当它从 uuidData
中删除或 uuidData
超出范围时,它将被正确销毁和释放。当表达式完成时,临时文件会自动销毁 (ergo the name Automatic variable)。
这里不可能有泄密的可能。
我有以下结构和映射
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
并将其映射到密钥。这个新 dataStruct
由 uuidData
管理。它从哪里来,到哪里去,与你无关。一旦映射到 uuid
的 dataStruct
存在,就会返回对它的引用。
现在我们有对地图中现有 dataStruct
和临时 dataStruct
的引用。 =
只是简单地将右侧临时对象的内容复制到左侧引用所代表的对象中。左侧对象中的任何内容都被覆盖,但该对象仍然存在并且仍由 uuidData
管理。当它从 uuidData
中删除或 uuidData
超出范围时,它将被正确销毁和释放。当表达式完成时,临时文件会自动销毁 (ergo the name Automatic variable)。
这里不可能有泄密的可能。