std::unordered_map<int32_t,int32_t>堆上声明

std::unordered_map<int32_t, int32_t> declared on heap

本文关键字:int32 声明 gt std unordered map lt      更新时间:2023-10-16

在堆上声明std :: unordered_map的语法是什么,对其进行了一些操作,然后释放它?我在做:

std::unordered_map<int32_t, int32_t> *map_temp_last_close = new std::unordered_map<int32_t, int32_t>;
*(map_temp_last_close[val]) = *(int32_t*)(read_buffer + 30); //this happens multiple times in a loop
int32_t some_val = val * (*(map_temp_last_close[val]))
map_temp_last_close->clear();
delete(map_temp_last_close);

编辑:为什么我需要将它放在堆上?我总是一个运行函数,该功能不断从网络接收数据,在某些情况下,将数据存储在地图中以处理它。一旦地图结束,我知道我将不会再次在协议中收到该消息,因此不需要地图,但是该地图并没有超出范围从网络阅读)。因此,我想通过调用freedelete或其他东西来释放该内存。

您的错误是牙套的定位。您必须首先删除参考,然后索引进入数据结构。

我也不会首先将其放在堆上,因为std::unordered_map已经将其数据存储在内部的堆上,但是如果您真的需要,我能想到的最简单,最安全的方法是:::

auto map_temp_last_close = std::make_unique<std::unordered_map<int32_t, int32_t>>() 
(*map_temp_last_close)[val] = *(int32_t*)(read_buffer + 30); 
int32_t some_val = val * (*map_temp_last_close)[val];
//map object will get destroyed automatically when map_temp_last_close goes out of scope, but if you want to delete it earlier, you can use:
map_temp_last_close.reset();

这将在堆上创建一个std::unordered_map,并且可以管理它的本地unique_ptr变量:每当map_temp_last_close脱离范围时(无论是通过返回,一个例外,或仅仅是因为当前范围结束),它将自动删除该范围地图。另外,没有理由在破坏之前调用clear,因为地图将自动执行。

注意:
最有可能(取决于read_buffer的类型)此表达式:*(int32_t*)(read_buffer + 30)是未定义的行为。