在堆上声明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);
编辑:
为什么我需要将其放在堆上?我有一个始终运行的功能,该功能不断从网络接收数据,在某些情况下,将数据存储在地图中以进行处理。一旦映射的使用结束,我知道我将不再在协议中接收到该消息,因此不再需要映射,但是由于函数处于无限循环中,因此该映射不会超出范围(从网络读取)。因此,我想通过调用
free
或delete
或其他方式释放内存。 最佳答案
您的错误是括号的位置。您必须先取消引用,然后再索引到数据结构中。
我也不会一开始就将其放在堆上,因为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)
是未定义的行为。关于c++ - 在堆上声明了std::unordered_map <int32_t,int32_t>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40859457/