2012-02-20 2 views
0

は、ここで私は唯一の100バイトが割り当てられていると私は0-99 .IEから整数を格納しています。ここに私のコードC++の動的割り当てで配列の境界がチェックされていませんか?

#include<iostream> 
#include<fstream> 
using namespace std; 
int main() 
{ 
    int* arr = new(nothrow)int [100]; 
    int i; 
    if(arr == 0){//heap is full or dynamic allocation fails 
    cout<<"Cannot allocate memory\n"; 
    return 0; 
    } 
    ofstream file("myFile.bin",ios::out|ios::binary);//opening the file in binary mode 

    for(i = 0;i<100;++i){//dynamic array which contains numbers form 0 to99 
     arr[i] = i; 
    } 
    if(file.is_open()){ 

     if(file.good()) 
      file.write((char*)arr,400); 

     delete [] arr; 
     file.close(); 
    } 

    ifstream file1("myFile.bin",ios::in|ios::binary|ios::ate); 
    ifstream::pos_type size; 
    char* buff; 
    if(file1.is_open()){ 

     size = file1.tellg(); 
     buff = new char[size]; 
     file1.seekg(0); 

     if(file1.good()) 
      file1.read(buff,size); 

     file1.close(); 
     for(i=0;i<size;i= i+4){//gcc => sizeof(int) is 4 
      cout<<(int)*(buff+i)<<" "; 
     } 
     delete [] buff; 

    } 



} 

です。 400バイト(gcc)。 割り当てられていないメモリにアクセスしています。セグメンテーションフォルトが発生していません。 なぜそれが起こっていますか?

出力は0 1 2 3 .... 99

+0

ちょうどラッキーです。実際、ちょうど運が悪い。 – pmr

+1

"ここでは100バイトしか割り当てられていません"。 「ここ」はどこですか? 2つの 'new'式、' new(nothrow)int [100];と 'buff = new char [size];'があります。どちらが100バイトだと思いますか? –

+0

int型の最初のものは既にあります: –

答えて

8

実際には、100バイトを割り当てていません。 100 intを割り当てました。ここにはオーバーランはありません。

+2

+1実際に彼のコードを読んでいます。 – jrok

+0

ok ...新しいint [100]は100バイトではなく100の整数を意味しますか? –

+0

@JinuJD:正しい。 –

2

割り当てられたメモリチャンクは、要求したサイズよりも大きい場合があります。そしてあなたは幸運です、はい。 C++は境界チェックを行いません。これは開発者の責任です。

2

セグメンテーション違反は、マップされていないページにアクセスする場合にのみ発生します。割り振りの背後に数バイトしか浮かないと、そこにページの境界がない可能性が非常に高いので、MMUはエラーを検出できません。

あなたはまだヒープをゴミ箱に入れている可能性があります。

2

Segfaultsはエラーとして許可されています。

ただし、これらの状況でベクターを使用することを強くお勧めします。それをインターフェイスに使用します。

std::vector<int> v(100); 
v.at(100); //throws range check exception 
v[100]; //does not throw for efficiency. 
関連する問題