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

时间:2012-05-17 02:07:59

标签: c++ pointers insert dereference stdmap

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个插入,我没有收到任何访问冲突,然后,突然,bam。我检查了通常的嫌疑人:32位阈值和内存不足,插入引爆时一切看起来都不错。我知道这是一个插入,因为我可以看到它通过调试器中的STL std :: map代码,但是我读不清楚它正在尝试访问插入的内容。

这段代码是坏消息吗?任何了解C ++比我更多的人的见解都会受到赞赏。感谢。

1 个答案:

答案 0 :(得分:0)

您向我们展示的代码应该非常好。然而,几乎可以肯定的是,其他代码你没有向我们展示直接导致问题,或者更可能只是在某些情况下导致内存损坏,当它恰好碰到地图时会破坏。

如果您可以在Linux上编译代码库,那么valgrind很有可能为您找到内存错误。