W porządku, myślę, że wszyscy zgadzamy się, że to, co dzieje się z następującym kodem, jest nieokreślone, w zależności od tego, co zostanie przekazane,
void deleteForMe(int* pointer)
{
delete[] pointer;
}
Wskaźnik może być najróżniejszymi rzeczami, więc wykonanie delete[]
na nim bezwarunkowego działania jest nieokreślone. Załóżmy jednak, że rzeczywiście przekazujemy wskaźnik tablicy,
int main()
{
int* arr = new int[5];
deleteForMe(arr);
return 0;
}
Moje pytanie brzmi: w tym przypadku, gdy wskaźnik jest tablicą, kto to wie? Chodzi mi o to, że z punktu widzenia języka / kompilatora nie ma pojęcia, czy arr
jest to wskaźnik tablicy czy wskaźnik do pojedynczego int. Heck, nawet nie wie, czy arr
został stworzony dynamicznie. Jeśli jednak wykonam następujące czynności,
int main()
{
int* num = new int(1);
deleteForMe(num);
return 0;
}
System operacyjny jest na tyle inteligentny, że usuwa tylko jedną int i nie wykonuje jakiegoś `` szaleństwa zabijania '', usuwając resztę pamięci poza tym punktem (w przeciwieństwie do tego strlen
i \0
niezakończonego ciągu - będzie kontynuował trafienia 0).
Więc do kogo należy zapamiętywanie tych rzeczy? Czy system operacyjny przechowuje w tle jakiś rodzaj rekordów? (Mam na myśli, zdaję sobie sprawę, że zacząłem ten post od stwierdzenia, że to, co się dzieje, jest nieokreślone, ale faktem jest, że scenariusz `` szaleństwa zabijania '' nie ma miejsca, więc w praktycznym świecie ktoś pamięta.)