-1

クラスオブジェクトを含むベクトルがあります。私はこのように宣言しました

vector<Aircraft> queue;

ベクトルの最初の要素を消去します。しかし、それはまだベクトルの最初の要素のようです。これは私がしました。

queue.erase(queue->begin());
cout<<queue.size(); //printed 0 
Aircraft temp = queue.front();
cout<<temp.id; //expected a segfault error

最初の要素を消去した後、ベクトルのサイズは0です(要素は1つしかありませんでした)。ベクトルから最初の要素を消去し、その後サイズがゼロになったため、temp(Aircraft)のIDを確認しようとしたときに、セグメンテーション違反エラーが発生することが予想されていました。ベクトルをクリアしましたが、「queue.front」はオブジェクトを返し、coutステートメントはオブジェクトのIDを出力します。

4

3 に答える 3

6

空ののにアクセスするのは未定義の動作なので、アクセスしてはいけません。また、アクセスした場合、プログラムの見かけの動作から何も推測できません。front()vector

queue.size()通話前より1つ少ないという事実は、それが機能したことを示している.eraseはずですerase

于 2012-06-08T17:45:39.700 に答える
0

おそらく、あなたは未定義の振る舞いに向かっています。ベクトルはメモリをゼロにする必要はありません。

于 2012-06-08T17:44:07.753 に答える
0

典型的なベクトルの実装には、通常、たとえば16要素のスタックバッファがあります。そのサイズまでベクトルを成長させると、memの割り当ては発生しません。したがって、要素を削除した後でも、メモリはまだそこにあり(キャッシュのようですが、使用する準備ができています)、Aircraftがデストラクタで自身をクリーンアップしない限り、同じ値が表示されます。

この実験を行います。航空機のデストラクタでID(たとえば-1234)をポイズニングし、コードを再実行します。毒の値などに頼るのは悪い習慣なので、学習実験と同じように保管してください。

また、ベクターに別のアイテムを追加してから、前面をもう一度印刷します。あなたは新しいアイテムを手に入れるでしょう。

また、デバッグモードでコンパイルされたコードを実行してみてください。クラッシュが予想される場所でfront()を呼び出すと、アサートが発生します。常にデバッグモードで新しいコードを実行します。それが目的です。

于 2012-06-08T18:09:34.633 に答える