在堆

时间:2016-11-29 06:49:49

标签: c++ pointers heap unordered-map

在堆上声明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或其他内容来释放内存。

1 个答案:

答案 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)是未定义的行为。