1

私はC ++を初めて使用し、おそらく次の バグに遭遇しましたが、どういうわけか私のプログラムはうまくいきます..コードは次のとおりです

#include<iostream>
#include<queue>
#include <string>


int main()
{
 string s ("cat");
 queue<string> _queue;
 _queue.push(s);
 string & s1 = _queue.front();
 _queue.pop();
 // at this time s1 should become invalid as pop called destructor on s
 std::cout << s1 << std::endl;
 return 0;

 }

s1 が無効なオブジェクトへの参照であっても、機能します。s1 が本当に無効なオブジェクトを参照していると断言できる方法はありますか?

4

1 に答える 1

5

コードで行う方法で破棄されたオブジェクトにアクセスしようとすると、未定義の動作が発生します。いいえ、この状況の実行時チェックを実行する言語提供の方法はありません。コードでそのようなことが起こらないようにするのは、完全にあなたの責任です。

あなたの実験で「うまくいく」という事実は、単なる偶然です(いつものように、ある程度の典型的なコンピューター決定論があります)。プログラム内でまったく関係のない何かが変更される可能性があり、このコードは「機能」しなくなります。

于 2012-10-05T22:12:42.250 に答える