new i delete - wyjaśnienie działania programu

0

Czy mógłby mi ktoś wyjaśnić dlaczego program wypisuje 0, 0, 3, 4, ...,25, a po zakomentowaniu linijki z delete[] tab wypisuje same zera?

#include <iostream>
 
using namespace std;
 
int main(){
    int *tab=new int;
    for(int i=0; i<25; i++){
      tab[i]=i+1;
      delete[] tab;
      tab=new int[25];
    }
    for(int i=0; i<25; i++)
      cout << tab[i] << " ";
return 0;
}
1

Tak akurat wychodzi, że w momencie, gdy zwalniasz pamięć przy użyciu delete, w następnym new zostaje Ci przydzielony ten sam bufor (wskaźnik), tyle że menedżer pamięci sobie oznacza, że tym razem o większym rozmiarze (początkowo alokujesz 1 * sizeof(int), potem 25 * sizeof(int)).

Natomiast Twój program narusza standard języka C++, ponieważ nieprawidłowe jest takie zachowanie:

int* tab = new int[10];
std::cout << tab[1]; // niezgodne ze standardem, ponieważ nigdzie nie przypisałeś tab[1] żadnej wartości

A coś takiego właśnie robi Twój program.

1

Już w pierwszym obiegu pętli masz undefined behaviour, więc dalsze rozważanie dlaczego program zachowuje się tak a nie inaczej jest bezcelowe:

int *tab = new int;
...
delete[] tab;

Jak alokujesz przez new, to zwalniasz przez delete, a jeśli przez new[] to delete[]. Mieszanie tego to UB.

Ten cout to kolejny UB, bo tuż przed wyjściem z poprzedniej pętli właśnie wyczyściłeś swoją "tablicę" przez delete[] i zaalokowałeś zupełnie nową "tablicę" ale nie zainicjalizowałeś komórek tej "tablicy", ale o tym @Patryk27 już wspomniał.

1 użytkowników online, w tym zalogowanych: 0, gości: 1