std::unordered_map<int32_t,int32_t>堆上声明
std::unordered_map<int32_t, int32_t> declared on heap
在堆上声明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)
是未定义的行为。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 未在作用域中声明unordered_map
- C++避免重复声明的语法是什么
- 如何确保C++函数在定义之前声明(如override关键字)
- 错误:未在此范围内声明'reverse'
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 为什么在定义函数之前先声明它
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- #ifdef和未声明的标识符
- 没有显式声明的int[]中的foreach
- 在基于范围的for循环中使用结构化绑定声明
- 在将变量声明为引用时,堆在释放后使用
- C++:无法访问声明的受保护成员
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 在函数内部的声明中初始化数组,并在外部使用它
- Visual Studio中的函数声明和函数定义问题
- c++类声明时,相同的例程,不同的成员变量类型
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别