取消引用刚刚插入的 std::map 值有时会导致访问冲突
dereferencing just-inserted std::map value sometimes leads to access violation
Label_Info只是一个包含一些 int 成员的琐碎类:
class Label_Info {
public:
Label_Info();
unsigned int x, x1, x2, y, y1, y2, size;
};
Label_Info::Label_Info() {
this->x = this->y = this->size = 0;
this->x1 = this->y1 = -1;
this->x2 = this->y2 = 0;
}
然后,使用 gcc 编译:
std::map<unsigned int, Label_Info> labels_info;
unsigned int label = 1;
Label_Info *label_info = &labels_info[label];
很少,我被第三行的访问违规阻止。据我了解,正在发生的事情是 std::map 为键 1 插入一个新Label_Info,然后label_info指向该键的指针。然后(至少当它没有崩溃时!我可以像这样访问成员:
label_info->x = 25;
。等等。我大约 1,000,000 次插入没有收到访问违规,然后,突然,砰。我检查了通常的嫌疑人:32 位阈值和内存不足,引爆时插入物上一切看起来都很好。我知道这是一个插入,因为我可以看到它通过调试器中的 STL std::map 代码,但我无法很好地阅读它来判断它试图访问插入的内容。
那么这段代码是坏消息吗?比我更了解C++的人的任何见解将不胜感激。谢谢。
您向我们展示的代码应该完全没问题。但是,几乎可以肯定的是,您没有向我们展示其他代码,这些代码要么直接导致问题,要么在某些情况下更可能只是导致内存损坏,并且当它恰到好处时,地图会中断。
如果你可以在Linux上编译你的代码库,那么valgrind
很有可能为你找到内存错误。
相关文章:
- 写入位置0x0000000C时发生访问冲突
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 链表中写入访问冲突的未知原因
- C++中的openCV Mat访问冲突
- C++尝试深度复制唯一指针时出现内存访问冲突
- C++ 中动态二维数组的访问冲突
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 写入访问冲突异常
- 在类 12.exe 中0x7B37FF80 (ucrtbased.dll) 引发异常: 0xC0000005:访问冲突读
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 读取访问冲突.这0xCDCDCDCD
- 0xC0000005:访问冲突读取位置 0x00000000. 重载 == 运算符的问题
- 插入数组时违反写访问冲突
- 使用 ReadProcessMemory 获取字符串值的访问冲突
- 尝试通过共享指针使用变量时读取访问冲突
- std::map.clear()正在引发读取访问冲突
- 使用 std::map 作为本地成员的内存访问冲突
- 取消引用刚刚插入的 std::map 值有时会导致访问冲突
- 访问map时的访问冲突
- 给map vector容器的元素赋值时发生访问冲突