Visual C++ではまる Expression: map/set iterator not dereferencable

シェアする

  • このエントリーをはてなブックマークに追加

スポンサードリンク

Expression: map/set iterator not dereferencableというメッセージでハマりました

Visual C++でコーディングしていてテストしていると、たまに以下のメッセージが出てきてしまい、結構はまりました。
頭を整理するためにおさらいしてみます。

GW-00477

Debug Assertion Failed!
Program: C:\Windows\system32\MSVCP110D.dll
File: C:\Program Files (x86)\Microsoft Visual Studio
11.0\VC\include\xtree
Line: 237

Expression: map/set iterator not dereferencable

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)

スポンサードリンク

C++のSTL(Standard Template Library)とは

C++のSTLとは、C++からvector、list、set、mapなどのコンテナなどを使えることができる便利なライブラリ群です。
このあたりは、Javaでは標準で装備されています。
その昔、C言語を使っていた頃ではC言語ではコンテナが標準で装備されていないので自分たちで実装しておりました。
私の場合、C言語の後に、少しだけC++を触ってから、Javaを使い始めたので、Javaを使い始めた当時は、なんて便利なんだろうって思いました。
C++のSTLでは、Javaを参照にして実装したのでしょうか?
Javaのコンテナとよく似ています。

mapを使ったサンプルは以下の通りです。

実行してみるとこんな感じになります。

mapで大事なことの一つに必ず、値の入力順ではなくてキーの順番にソートされることです。
これは、結構重要です。

スポンサードリンク

Expression: map/set iterator not dereferencableの原因

上記のコードですが、以下のように変更してみます。

すると見事に
check1 = (*it).first;
の行で map/set iterator not dereferencable というエラーが発生します。

要するにmapは空なのにも関わらず、イテレーターから値を参照しようとするのがマズいです。
このようにしてみると当たり前ですが、実は、呼び出し元からmapに値が入ってこないことがあまり考えられないケースだったのでハマってしまいました。

最後に dereferencable って何?

dereferencableって辞書を引いても載っていないです。
dereferencable は、Common misspelling of dereferenceable って書いてあります。
ミススペル?

さらに、derefenceを調査すると見つかりました。

derefence = 「ポインターから参照先の値を取得する」って載っていました。

Expression: map/set iterator not dereferencable
を訳すと
map/set iteratorのポインターから参照できませんでした。

となるのでしょうか。

まとめ

スタンダードテンプレートライブラリはとても便利なのですが、標準のC++本には書いていないものがほとんどです。
そんな中で、下記の本は唯一詳しく解説がありました。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

コメント

  1. vic より:

    これ、pair使わなくても大丈夫でした。
    map1[3.0f]= “aaa”;
    map1[5.0f]= “bbb”;
    map1[1.0f]= “ccc”;
    map1[6.0f]= “ddd”;
    map1[8.0f]= “eee”;
    map1[11.0f]= “fff”;
    for(auto a :map1) {
    cout << " first=" << a.first;
    cout << " second=" << a.second << endl;
    }

  2. vic より:

    説明不足でした。
    float で試したバージョンです。

    map map1;

  3. vic より:

    map<float, std::string> map1;

    仕方ないので全角文字にしました。<>

  4. urashita より:

    ほぉ。なるほどね。
    このサンプルだとpairなしで実装できるってことですね。

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です