2012-02-20 70 views
0

這裏是我的代碼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; 

    } 



} 

這裏我只分配了100個字節,我從0-99 .IE存儲整數。 400字節(gcc)。 我正在訪問未分配的內存。未發生分段錯誤。 爲什麼會這樣。

輸出是0 1 2 3 .... 99

+0

只是幸運。其實,只是回來運氣。 – pmr 2012-02-20 15:38:03

+1

「這裏我只分配了100個字節」。這是哪裏」?我看到兩個'new'表達式,'new(nothrow)int [100];'和'buff = new char [size];'。你認爲哪一個是100字節? – 2012-02-20 15:45:55

+0

第一個類型int..already得到了答案:) – 2012-02-20 16:31:37

回答

8

實際上,你還沒有分配100個字節。您已分配100 int s。這裏沒有超限。

+2

+1實際閱讀他的代碼。 – jrok 2012-02-20 15:42:14

+0

好的......所以新的int [100]表示不是100個字節,而是100個整數? – 2012-02-20 15:42:15

+0

@JinuJD:正確。 – 2012-02-20 15:42:54

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.