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];

ごくまれに、3 行目のアクセス違反で停止します。私が理解しているように、何が起こっているのかというと、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 に答える