c ++中的动态分配不检查数组边界?

时间:2012-02-20 15:35:15

标签: c++ file dynamic-memory-allocation

这是我的代码

#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

4 个答案:

答案 0 :(得分:8)

实际上,您还没有分配100个字节。你已经分配了100 int个。这里没有超支。

答案 1 :(得分:2)

分配的内存块可能大于您请求的大小。你很幸运,是的。 C ++没有边界检查。这是开发人员的责任。

答案 2 :(得分:2)

只有在对未映射的页面进行访问时才会发生分段错误。如果你只偏离分配后的几个字节,那么没有页面边界的可能性非常高,因此MMU无法检测到错误。

你仍然可能把垃圾堆丢弃。

答案 3 :(得分:2)

Segfaults被授予错误。

但强烈建议您在这些情况下使用矢量。并在接口处使用它。

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