それはなぜ機能しますか?未割り当てメモリをエラーなく使用していますか?
#include <iostream>
using namespace std;
int main() {
float* tab[3];
int i = 0;
while(i < 3) {
tab[i] = new float[3-i];
i++;
}
cout << tab[2][7] << endl;
tab[2][7] = 6.87;
cout << tab[2][7] << endl;
i = 0;
while(i < 3)
delete[] tab[i];
}
この1つはありませんか?
#include <iostream>
using namespace std;
int main() {
float* tab = new float[3];
cout << tab[7] << endl;
tab[7] = 6.87;
cout << tab[7] << endl;
delete[] tab;
}
私は両方のプログラムをWin XPでMS VS 2008と一緒に試しましたが、両方ともエラーなしでコンパイルされ、最初のプログラムはエラーなしで実行されました。 2番目のポップアップウィンドウにエラーウィンドウが表示されましたが、私はそれを思い出すことができず、再現できません(現時点ではWindowsへのアクセス権はありません)。
g ++でLinux(Kubuntu 10.10とプリコンパイル済みカーネルパッケージバージョン2.6.35.23.25)を試してみましたが、コンパイルと実行の両方にエラーは発生しません。
なぜですか? 「未割り当てメモリへの不正アクセス」のようなポップアップはありませんか?
私はそれがエラーなしでコンパイルされるべきだと知っていますが、私はそれがなければ実行してはいけないと思っていました...そして、なぜ2番目の例がWindowsではなくLinuxでエラーになるのですか?
でも、std :: vectorはデバッグビルドの境界チェックをしています(ありがたいことに!) –
'vector :: at()'を使わないか、またはインデックスではなくイテレータで作業します。 – Eclipse
実際、これもかなり間違っています。最初に、標準に「ページ」というようなものはなく、すべての実装があなたがその点でそうすると主張しているように動作するわけではありません。第2に、アレイがスタック上にある場合にのみスタックを上書きすることができます(スタックを使用するシステムでも)。フリーストアから割り当てられたメモリはスタックにありません。あなたが話している攻撃の種類は、 'void f(){char buf [SZ]; gets(buf); } 'はOPの問題ではありません。 –