0

私の SDL プログラムでは、マップ構造を使用して、特定のクラス内のオブジェクトの「無限」配列をシミュレートしています。コードは問題なくコンパイルできますが、プログラムを実行すると、マップを使用する関数の 1 つがトリガーされるとすぐにプログラムがクラッシュし、値 3 が返されます。

だから、これがまさに私がやっていることです:

class MyClass
{
     public:
           int MyFunction();
     protected:
           std::map< int, MyObject > MyMap;
}

int MyClass::MyFunction()
{
     ...
     int i;

     if( MyMap.empty() )
     {
          i = 1;
     }
     else
     {
         i = MyMap.size() + 1;
     }

     MyMap[ i ] = PreviouslyDefinedObject;

     return i;

}

MyFunction() が MyClass オブジェクトから呼び出されると、クラッシュが発生します。MyMap で何らかの使用が行われるたびに発生するようです: 最後から 2 番目の行をコメントアウトして i を返そうとするとクラッシュし、i = 1 を設定してオブジェクトを MyMap[i] に割り当てるとクラッシュします。

地図を使ったのはこれが初めてなので、地図を正しく使っているか確信が持てません。これはどこかの基本的な間違いですか?誰かが私を正しい方向に向けることができますか? 乾杯。

4

2 に答える 2

3

次のように、初期化されていないポインターから関数を呼び出している可能性があります。

MyClass *obj;
obj->MyFunction();
于 2009-11-24T06:47:35.403 に答える
0

マップは、キーを値に関連付けるために使用されます。配列を探している場合は、vector. マップは配列ではないため、マップよりも「無限配列」をシミュレートするのに適しています。

通常、ベクトルを使用して多くの要素を割り当てることができることに注意してください。本当に大きな配列をシミュレートしようとしている場合は、ベクトルのベクトルをラップすることをお勧めします。operator[]いくつかの数学を使用して、正しい配列、正しい要素にインデックスを付ける for it を作成できます。

あなたのコードに関しては、クラッシュの原因を特定するのに十分な情報がありません。コンパイルまたは確認するための最小限のプログラムを作成する必要があります。

于 2009-11-24T06:40:13.517 に答える