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 arrjest to wskaźnik tablicy czy wskaźnik do pojedynczego int. Heck, nawet nie wie, czy arrzostał 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 strleni \0niezakoń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.)