Динамическое размещение в C ++ не проверяет границы массива? - PullRequest
0 голосов
/ 20 февраля 2012

Вот мой код

#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 байт (гкц). Я обращаюсь к памяти, которая не выделена. Ошибка сегментации не произошла. Почему это происходит ??1004*

Вывод 0 1 2 3 .... 99

Ответы [ 4 ]

8 голосов
/ 20 февраля 2012

На самом деле, вы не выделили 100 байтов. Вы выделили 100 int с. Здесь нет никакого перегрузки.

2 голосов
/ 20 февраля 2012

Сегфоулты выдаются как ошибки.

, однако настоятельно рекомендуется использовать вектор в этих обстоятельствах.и использовать его в интерфейсе.

std::vector<int> v(100);
v.at(100); //throws range check exception
v[100]; //does not throw for efficiency.
2 голосов
/ 20 февраля 2012

Ошибка сегментации возможна только в том случае, если осуществляется доступ к странице, которая не отображается. Если вы выделяете только несколько байт для своего выделения, велика вероятность того, что там нет границы страницы, поэтому MMU не сможет обнаружить ошибку.

Вы, вероятно, все еще можете уничтожить кучу.

2 голосов
/ 20 февраля 2012

Выделенный фрагмент памяти может быть больше, чем запрошенный вами размер. И тебе повезло, да. C ++ не проверяет границы. Это ответственность разработчика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...