取消引用刚刚插入的 std::map 值有时会导致访问冲突

dereferencing just-inserted std::map value sometimes leads to access violation

本文关键字:访问冲突 map 插入 引用 std 取消      更新时间:2023-10-16

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很有可能为你找到内存错误。