在堆上声明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
或其他内容来释放内存。
答案 0 :(得分:2)
您的错误是大括号的位置。您必须首先取消引用,然后将索引到数据结构中。
我也不会把它放在堆上,因为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)
是未定义的行为。