2016-08-04 3 views
2

私は以下のC++のサンプルコードを持っており、私はLINE IIでランタイムエラーが発生すると考えていました。 mynumbers1+6C++でpast-the-end要素を過ぎてアクセスすると、ランタイムエラーが発生しないのはなぜですか?

0, 1, 2, 3, 4, 5, 6, 

私が変更した場合は、例えば、マージの2番目のパラメータ、私はランタイムエラーを取得:

#include <vector> 
#include <iostream> 
#include <algorithm> 
using namespace std; 
void printer(int i) { 
     cout << i << ", "; 
} 
int main() { 
     int mynumbers1[]={3, 9, 0, 2}; 
     int mynumbers2[]={6, 1, 4, 5}; 
     vector<int> v1(7); 
     sort(mynumbers2, mynumbers2 + 4); 
     sort(mynumbers1, mynumbers1 + 4);//LINE I 
     merge(mynumbers1, mynumbers1+5, mynumbers2, mynumbers2+5, v1.begin());//LINE II 
     for_each(v1.begin(), v1.end(), printer); 
     return 0; 
} 

しかし、プログラムの出力は、実際にある

*** Error in `./program': free(): invalid next size (fast): 0x0000000002468010 *** 
0, 1, 2, 3, 4, 5, 6, Aborted (core dumped) 

過去エンド要素はmynumbers1+4であり、したがって、私はランタイムエラーをスローするmynumbers1+5を期待ので、私は驚いています。しかし、明らかにこれはそうではありません。

私はUbuntuの仮想マシン上でg++ (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4を使用しています。何のランタイムエラーがスローされない理由

は、誰かが私に説明できますか?
未定義の動作ですか?
マシンまたは実装に依存しますか?
そして、最も重要なのは、なぜ「範囲外」のケースではランタイムエラーがスローされるのですが、他の「範囲外の」ケースではランタイムエラーがスローされないのですか?このエラーはどこから来たのですか?配列かベクトルか? はお時間をいただき、ありがとうございます

+1

境界チェックを支援するために 'のstd :: array'でこの –

+0

見てのように多くの重複があります。 –

+0

ありがとう。しかし、両方のコメントは私が正直であるのを助けるものではありません。私は「外れた」2つのケースを示しました。あるケースではランタイムエラーがあり、もう1つのケースではランタイムエラーはありません。それが混乱し、矛盾していますか?私はそれが重複しているとは思わない。別の言い方をすれば、私はC++に言及し、Cには言及していません(独自の仕様を持っています)。この例ではVectorを使用しています。 – Elyasin

答えて

5

C/C++は、任意の範囲のチェックを行いません。これは、パフォーマンスのペナルティがあるためです。その範囲を超えて配列にアクセスすることは、未定義の動作です。データの破損など何かが起こる可能性があります。幸運なことに、プログラムがクラッシュしたと考えてください。

関連する問題