2012-03-02 9 views
0

このプログラム考えてみましょう:の15番目の要素にアクセスすることを求めたが、それは(私のシステムで出力0)していない場合、私はそれがクラッシュを期待するC++ベクトル奇妙な行動

#include <iostream> 
#include <vector> 

using namespace std; 

int main(void) 
{ 
    vector<double> a; 
    while (a.size() <= 10) 
     a.push_back(2); 
    cout << a[15] << endl; 
} 

を。何がありますか? gccなどの新機能ですか?

+2

クラッシュする可能性があります。それは未定義の振る舞いの美しさです。 – Mysticial

+0

そのことを止めること..ベクトルは能力を伸ばすことができます!テストをすると、彼のベクトルには16という容量があることがわかります。これは[15]が有効であることを意味します! –

+2

@riskio 'a [15]'は 'a.size()> 15 'の場合にのみ有効です。さもなければ、それは標準に従って、未定義の動作です。 (そして実際に、それはおそらく、デバッグビルドでクラッシュします。) –

答えて

0

operator[]は境界チェックを行わず、この場合、実行時エラーを発生させることなくその場所のアドレスを読み取ることができました。

3

あなたは未定義の動作につながる不正なメモリ位置にアクセスしています。だから何事も起こるかもしれない。

0

それは、ベクターは、それがa.sizeを挿入されているサイズ()だ成長strange..aではありません - ..あなたは、20個の要素の種類を持って、今element..so 1(そうでないかもしれないが、20以上11(=)

+0

この簡単な例では、その場所にあるものは、その場所にあるものを知っている現実の世界でうまくいくかもしれません。ストレージはそこにあるかもしれませんが、そのサイトにオブジェクトが構築されていないので、アクセスは未定義の動作です。 – Nim

+0

それは –

-1

あなたが読んでいるメモリは、それがクラッシュしないでしょう、あなたのプログラムの中にあるあなたがそれにアクセスする際、ベクターの成長が15よりも大きくなる可能性があるため、私は、C++が範囲

+0

...彼のquestion..but C++プログラマがSTLコンテナを知っている必要がありますし、それがすべてのCによてメモリ管理は、それがすべてのresponsabilityだということを知っている必要があります++プログラマより安全なものを行うための責任に答えなかったadvice..iではありませんそれはどこに標準で言いますか?私が使用する 'std :: vector'の実装は、少なくとも正しいオプションがコンパイラに渡された場合、境界チェックを行います。 (彼のコードは '-D_GLIBCXX_DEBUG'でコンパイルされたg ++でクラッシュします---一般にすべてのコンパイルに使用されるオプションで、プロファイラが別途指示するまでです。) –

0

をチェックしないのですか?

チェックcapacity()

+0

'capacity()'はここでは無関係です(11以上であることが保証されています)。それは重要な 'size()'です。 –

+0

いいえ、 'capacity()'は割り当てられた記憶容量のサイズを返します。 'size()'はコンテナ内の要素の数を返します。 –

+0

これはどのように関連していますか? (または、私が言ったことと矛盾します)。すべての 'capacity()'保証は、サイズが返される値を超えるまで、再割り当てが行われない(イテレータの無効化などはありません)ということです。 **初期化された値の終わりを越えてアクセスすることを許可していません**実際には、良い実装では、少なくともデバッグモードでは許可されません。 –

1

This references氏は述べていますそれ

ベクトル 容器内の位置Nの要素への参照を返すこと。

同様のメンバ関数、ベクター::では、そのベクトルを除いて、この 演算子関数と同じ動作を有する::信号で要求 位置が例外をスローして範囲外の場合。

だから、これはまたはクラッシュしない場合があります。

+0

はい境界チェックが必要な場合はat()を使用してください。 – 111111

+0

ええ、私はそれを見ましたが、nが範囲外であれば何が起こるのかは不明でした。境界から外れてnが未定義の動作になると明示的に述べた場合、私はこの質問をしなかったでしょう。 – user818794