2011-12-15 14 views
2

次のコードをコンパイルして実行するのはなぜですか。C++静的配列と新しい配列の境界にアクセスしていますか?

私は整数配列を作成し、そのサイズを10に割り当てました。なぜ、プログラムは、forループ内で配列外の要素にアクセスしようとしているというエラーを返さないのですか?

さらに、私は新しい概念を理解したいと思います。私の使用法は正しいですか(私は割り当てられたメモリの量を割り当てていません)、新しいことは私が動的サイズの配列つまり、実行時にこの配列のサイズを無期限に増やすことができます。間違っている場合は修正してください)。もしこれが正しいのであれば、私の違いは何ですか?両方とも明らかに、この例でわかるように、実行時に私の配列のサイズを増やすことができます。私はスコープ、スタック、およびヒープの違いについて知っているので、両方の変数はmainで宣言され、次のコードを例として使用すると仮定します。 未定義の動作の配列結果の境界を越えて要素にアクセス

http://ideone.com/Tbud1

#include <iostream> 
using namespace std; 

int main() 
{ 
int array[10]; 
int *arrays; 
arrays = new int(); 
for (int i=0; i<450; i++) 
{ 
    arrays[i] = i; 
    cout << arrays[i] << " "; 
    array[i] = i; 
    cout << array[i] << endl; 
} 
return 0; 
} 
+1

これはコンパイルエラーではないため、未定義の動作です。 –

+0

C++言語では、コンパイラが配列境界違反を検出する必要はなく、実際には試していません。 –

答えて

3


保証されているUndefine Behaviorのケースでは、コンパイラは特定のことを行う必要はありません。
潜在的に何かが起こる可能性があります。プログラムがクラッシュするかどうか、または不安定な動作を示す可能性があります。これは、標準によって許可されています。

リファレンス:

C++標準のセクション1.3.24状態:

許容未定義の動作が予期しない結果と完全に状況を無視してから、文書化された方法で翻訳やプログラム実行中に動作の範囲(診断メッセージの発行の有無にかかわらず)環境の特徴、診断メッセージの発行による翻訳または実行の終了に至るまで、

newのご理解が正しくありません。 newを使用すると、固定量のメモリをフリーストアに割り当てることができます(a.k.aヒープ)。割り当てられたメモリの範囲を拡張すると、追加のメモリが割り当てられません。範囲を超えないように十分なメモリを割り当てる必要があることは、あなた次第です。

arrays = new int[10]; 

をまた、あなたが割り当てられたメモリを使用して行われたり、それが結果一度delete[]を呼び出すことを忘れないでください、:あなたがやっている必要がありますので、あなたのプログラムで

あなたが10個の配列要素に等しいメモリを割り当てるしようとしていますメモリリークが発生します。

delete []arrays; 

あなたの用法に従って自動的に増加するデータ構造が必要な場合は、C++はstd::vectorの形であることを提供します。

関連する問題