2012-02-20 72 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.