0

次のようなコードがあります

template <typename KeyType, typename ValueType>
KeyType IDSystem<KeyType,ValueType>::registerParameter(const ValueType& value)
{
    KeyType key = __IDCounter++;
    _Map[key] = value; //crashes here
    return key;
}

_Map はどこにありますか

std::map<KeyType, ValueType> _Map;

指示された場所でプログラムがクラッシュしていたので、その行を次のように置き換えました

_Map.at(key) = value; //out_of_range thrown here

そして今、プログラムは同じ行で std::out_of_range 例外をスローします...

KeyType は標準ライブラリの int64_t で、ValueType はクラス (MyClass* など) へのポインタです。

驚くべき部分は、以前と同じように std::map を使用したことです...そして問題は発生しませんでした。

std::map を間違って使用していますか? お知らせ下さい。

4

4 に答える 4

3

問題は地図にはありませんでした。このクラスへのポインタが正しく初期化されなかったため、問題が発生しました。

すべての努力に感謝し、誤解を招く質問をお詫び申し上げます。

于 2013-03-02T20:21:48.973 に答える
3

存在しないキーにアクセスしようとすると、末尾反復子が返されるためfind、演算子の代わりに使用することをお勧めします。[]

あなたのコードに関しては、時間をかけてSSCCEを投稿してください。上記の数行のコードに問題は見当たりません。

于 2013-03-02T18:58:31.437 に答える
1

書かれているコード(おそらく何も害を与えていないアンダースコア名を除いて)は問題ないので、問題は他の場所で発生している可能性があります。特に、フリーストアが破損している場合(新しくないポインターを削除するか、割り当てられたブロックの終わりを実行することによって)、フリーストアが使用されているほとんどすべての場所に症状が現れる可能性があります。map::operator[]マップにまだ存在しないキーを指定すると、無料ストアが使用されるため、それが問題であると思われます。何か他のものがヒープを爆破しました。

于 2013-03-02T19:26:17.740 に答える
1

例外はニシンのout_of_range読み取りであり、元のクラッシュの問題とは別の問題です。

問題は、次の場合です。

_Map[key] = value;

だからあなたは課題をやっています。
これは、代入演算子が不適切であることを示しています (または、代入演算子で行っている何かが他の不適切なコードにヒットしている可能性があります)。

何が原因なのかわからないためValueType、この時点を超えて問題を診断することはできません。を実装していることを確認することをお勧めしますrule of 3(5) correctly

の定義とその代入演算子を提供していただければ、ValueTypeさらにお役に立てるかもしれません。通常、このタイプの問題の場合、問題を生成して投稿することができるコンパイル可能な最小の例に問題を縮小するのが最善です。

于 2013-03-02T19:32:17.587 に答える