с использованием нераспределенной памяти без ошибок?

Почему это работает?

#include <iostream>
using namespace std;

int main() {
    float* tab[3];

    int i = 0;
    while(i < 3) {
        tab[i] = new float[3-i];
        i++;
    }

    cout << tab[2][7] << endl;
    tab[2][7] = 6.87;
    cout << tab[2][7] << endl;

    i = 0;
    while(i < 3)
        delete[] tab[i];
}

а эта нет?

#include <iostream>
using namespace std;

int main() {
    float* tab = new float[3];

    cout << tab[7] << endl;
    tab[7] = 6.87;
    cout << tab[7] << endl;

    delete[] tab;
}

Я пробовал обе программы на Win XP с MS VS 2008, обе скомпилированы без ошибок, и первая работала без ошибок . Во втором появилось всплывающее окно с ошибкой, однако я не могу его вспомнить и не могу воспроизвести (на данный момент нет доступа к Windows).

Я пробовал их также в Linux (Kubuntu 10.10 с предварительно скомпилированным пакетом ядра версии 2.6. 35.23.25) с g ++, и оба компилируются и запускаются без ошибок.

Почему? Разве не должно быть всплывающих окон с чем-то вроде «Неправильный доступ к нераспределенной памяти»?

Я знаю, что он должен (и, к счастью, компилируется) без ошибок, но я подумал, что он не должен работать без них .. . И почему второй пример дает ошибки в Windows, а не в Linux?

8
задан silmeth 30 November 2010 в 17:45
поделиться