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

プログラミング
スポンサーリンク

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のポインターから参照できませんでした。

となるのでしょうか。

 

IT業界のミススペルについては以下にまとめました。

IT業界のスペルミス ミススペルが業界標準になる
IT業界ではスペルミスした単語が、そのまま広く使われてしまったために、今さら修正できなくなってそのまま標準として使われてしまうことがあります。 結構面白いので、ちょっと例を見てみましょう。 Google(企業名) googolのスペルミスで...

 

 

まとめ

スタンダードテンプレートライブラリはとても便利なのですが、標準のC++本には書いていないものがほとんどです。

 

プログラミングの無料レッスン体験

 

約8,000名の受講生と80社以上の導入実績のあるプログラミングやWebデザインのオンラインマンツーマンレッスンCodecamp

<Codecampの特徴>

1 現役エンジニアによる指導

2オンラインでのマンツーマン形式の講義

3大手企業にも導入されている実践的なカリキュラム

↓無料体験レッスン実施中です。

プログラミングのオンラインスクールCodeCamp

 

 

 

プログラミング
スポンサーリンク
スポンサーリンク
うらしたをフォローする
スポンサーリンク
urashita.com 浦下.com (ウラシタドットコム)

コメント

  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なしで実装できるってことですね。

タイトルとURLをコピーしました