私は以下のC++のサンプルコードを持っており、私はLINE IIでランタイムエラーが発生すると考えていました。 mynumbers1+6
へC++で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
を使用しています。何のランタイムエラーがスローされない理由
は、誰かが私に説明できますか?
未定義の動作ですか?
マシンまたは実装に依存しますか?
そして、最も重要なのは、なぜ「範囲外」のケースではランタイムエラーがスローされるのですが、他の「範囲外の」ケースではランタイムエラーがスローされないのですか?このエラーはどこから来たのですか?配列かベクトルか? はお時間をいただき、ありがとうございます
境界チェックを支援するために 'のstd :: array'でこの –
見てのように多くの重複があります。 –
ありがとう。しかし、両方のコメントは私が正直であるのを助けるものではありません。私は「外れた」2つのケースを示しました。あるケースではランタイムエラーがあり、もう1つのケースではランタイムエラーはありません。それが混乱し、矛盾していますか?私はそれが重複しているとは思わない。別の言い方をすれば、私はC++に言及し、Cには言及していません(独自の仕様を持っています)。この例ではVectorを使用しています。 – Elyasin