Niech zgadnę, kurs Zelenta?
Pojawienie się tego błędu to kwestia przypadku, ty akurat miałeś szczęście. Wskaźnik, który podajesz do operatora delete[] to nie to samo, co ten zwrócony przez operator new, wyjścia masz dwa: obliczyć podczas usuwania poprawny wskaźnik lub zachować nienaruszoną kopię (to drugie jest lepsze).
float *Tab;
Tab = new float [10];
for(int i=0;i<=9;i++) {
*Tab=25;
std::cout <<*Tab<<std::endl;
Tab++;
}
delete [] (Tab - 10);
float *Tab;
Tab = new float [10];
auto copy = Tab;
for(int i=0;i<=9;i++) {
*Tab=25;
std::cout <<*Tab<<std::endl;
Tab++;
}
delete [] copy;
A tu masz w ogóle lepsze podejście do problemu, bez ruszania wskaźnikami.
float *Tab;
Tab = new float [10];
for(int i=0;i<=9;i++) {
*(Tab + i) = 25.f;
std::cout << *(Tab + i) <<std::endl;
}
delete [] Tab;
Pamiętaj, że *(Tab + i) to w tym przypadku synonim Tab[i].
A Zelent mimo wielokrotnego omówienia tego błędu w internecie dalej nie poprawił swojego filmu i ludzie się z tego uczą, szkoda słów.