Tamam, sanırım hepimiz, aşağıdaki kodla olanların, geçirilene bağlı olarak tanımsız olduğunu kabul ediyoruz,
void deleteForMe(int* pointer)
{
delete[] pointer;
}
İşaretçi her türlü farklı şey olabilir ve bu nedenle delete[]
üzerinde koşulsuz bir işlem yapmak tanımsızdır. Ancak, bir dizi işaretçisini gerçekten geçtiğimizi varsayalım,
int main()
{
int* arr = new int[5];
deleteForMe(arr);
return 0;
}
Sorum işaretçisi bu durumda, bir olan bir dizidir, bu bilmesidir? Yani, dilin / derleyicinin bakış açısından, arr
bir dizi işaretçisinin tek bir int'e karşı bir işaretçi olup olmadığı hakkında hiçbir fikri yoktur . Heck, arr
dinamik olarak yaratılıp yaratılmadığını bile bilmiyor . Ancak bunun yerine aşağıdakileri yaparsam,
int main()
{
int* num = new int(1);
deleteForMe(num);
return 0;
}
İşletim sistemi, yalnızca bir int'i silecek kadar akıllıdır ve belleğin geri kalanını bu noktanın ötesinde silerek bir tür 'öldürme çılgınlığına' devam etmeyecektir (bununla strlen
ve \0
sonlandırılmamış bir dizenin kontrastı - devam edene kadar devam edecektir. isabet 0).
Peki bunları hatırlamak kimin işi? İşletim sistemi arka planda bir tür kayıt tutuyor mu? (Yani, bu göreve ne olduğunu tanımsız olarak söyleyerek başladığımı anlıyorum, ama gerçek şu ki, 'öldürme çılgınlığı' senaryosu gerçekleşmedi, bu nedenle birisinin hatırladığı pratik dünyada .)