1

私は当初、キューが破棄されたとき (たとえば、スコープ外になったとき)、含まれている要素を (それぞれのデストラクタを呼び出すことによって) 破棄する必要があると考えていました。同様に、pop() が呼び出されると、キューの最初の要素が破棄され、キューのサイズが 1 減ります。

しかし、私の理解を確認したところ、それは間違っているようです...私はこのようなものを使用しました

string& str = myQueue.front();
myQueue.pop();

(ここで、myQueue は文字列を含む空でないキューです)。

仕様によると、ここで見られるfront()ように、保持している最初の要素への参照を返す必要があります。

これは、キューをポップすると、最初の要素がなくなることを意味します。その後、「str」はまだ有効な文字列であることがわかりました!

何か問題がありますか?

ありがとう!

4

2 に答える 2

1

デストラクタが実行されることは正しいですが、文字列をゼロにする必要はありません。おそらくoperator delete、再利用のために文字列が占有するメモリを返すために呼び出します。しかし、そのメモリへのポインターとその中の文字は、そのままにしておくことができます。

C++ は、主にパフォーマンスのために設計されています。ライブラリが実行時に何かをする必要がない場合は、おそらくそうしません。このプログラムに実行時の問題を引き起こす可能性のあるアクティブ化できるデバッグ モードがあるかもしれませんが、実行が遅くなり、余分なメモリを消費する可能性もあります。

この種のエラーをキャッチするための優れたツールの 1 つは、Valgrind です。mallocプログラムを透過的な仮想マシンで実行し、呼び出しを追跡し、free無効なメモリまたは初期化されていないメモリにアクセスしたかどうかを通知します。

于 2013-06-08T02:49:36.487 に答える