เอาล่ะฉันคิดว่าเราทุกคนยอมรับว่าสิ่งที่เกิดขึ้นกับรหัสต่อไปนี้ไม่ได้กำหนดขึ้นอยู่กับสิ่งที่ส่งผ่าน
void deleteForMe(int* pointer)
{
delete[] pointer;
}
ตัวชี้อาจเป็นสิ่งที่แตกต่างกันได้ดังนั้นการดำเนินการอย่างไม่มีเงื่อนไขdelete[]
จึงไม่ได้กำหนดไว้ อย่างไรก็ตามสมมติว่าเรากำลังส่งตัวชี้อาร์เรย์
int main()
{
int* arr = new int[5];
deleteForMe(arr);
return 0;
}
คำถามของฉันคือในกรณีนี้ที่ตัวชี้เป็นอาร์เรย์ใครเป็นคนรู้เรื่องนี้ ฉันหมายถึงจากมุมมองของภาษา / คอมไพเลอร์ไม่มีความคิดว่าarr
เป็นตัวชี้อาร์เรย์หรือไม่เมื่อเทียบกับตัวชี้ไปยัง int เดียว Heck ไม่รู้ด้วยซ้ำว่าarr
ถูกสร้างขึ้นแบบไดนามิกหรือไม่ แต่ถ้าฉันทำสิ่งต่อไปนี้แทน
int main()
{
int* num = new int(1);
deleteForMe(num);
return 0;
}
ระบบปฏิบัติการมีความฉลาดพอที่จะลบเพียง int เดียวและไม่ใช้ 'ความสนุกสนานในการฆ่า' บางประเภทโดยการลบหน่วยความจำที่เหลือเกินกว่าจุดนั้น (ตรงกันข้ามกับสตริงที่strlen
ไม่มีการตัด\0
ทอนและจะดำเนินต่อไปจนกว่าจะถึง ฮิต 0)
แล้วใครล่ะที่ต้องจำสิ่งเหล่านี้? ระบบปฏิบัติการเก็บบันทึกบางประเภทไว้เบื้องหลังหรือไม่? (ฉันหมายความว่าฉันรู้ว่าฉันเริ่มโพสต์นี้โดยบอกว่าสิ่งที่เกิดขึ้นนั้นไม่ได้กำหนด แต่ความจริงก็คือสถานการณ์ 'ความสนุกสนานในการฆ่า' ไม่ได้เกิดขึ้นดังนั้นในโลกแห่งการปฏิบัติมีคนจดจำ)