3

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++ 的人的见解将不胜感激。谢谢。

4

1 回答 1

0

您向我们展示的代码应该非常好。但是,几乎可以肯定,您没有向我们展示的其他代码要么直接导致问题,要么更可能只是在某些情况下导致内存损坏,并且当它恰到好处时,地图就会中断。

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

于 2012-05-17T04:44:03.837 回答