หน่วยความจำ (และล็อคทรัพยากร) จะถูกส่งคืนไปยังระบบปฏิบัติการที่จุดที่กำหนดไว้ระหว่างการทำงานของโปรแกรม โฟลว์การควบคุมของโปรแกรมด้วยตัวเองนั้นเพียงพอที่จะรู้ว่าสามารถจัดสรรคืนทรัพยากรที่กำหนดได้อย่างแน่นอน เช่นเดียวกับที่โปรแกรมเมอร์มนุษย์รู้จักที่จะเขียนfclose(file)
เมื่อทำโปรแกรมด้วย
GCs แก้ปัญหานี้โดยการหาโดยตรงระหว่างรันไทม์เมื่อโฟลว์ควบคุมถูกดำเนินการ แต่แหล่งที่แท้จริงของความจริงเกี่ยวกับการควบคุมการไหลคือแหล่งที่มา ในทางทฤษฎีมันควรจะเป็นไปได้ที่จะกำหนดตำแหน่งที่จะแทรกการfree()
เรียกก่อนที่จะรวบรวมโดยการวิเคราะห์แหล่งที่มา (หรือ AST)
การนับการอ้างอิงเป็นวิธีที่ชัดเจนในการใช้สิ่งนี้ แต่ก็เป็นเรื่องง่ายที่จะพบกับสถานการณ์ที่ตัวชี้ยังคงอ้างอิง (ยังอยู่ในขอบเขต) แต่ไม่ต้องการอีกต่อไป สิ่งนี้เพียงแปลงความรับผิดชอบของการยกเลิกการจัดสรรพอยน์เตอร์ด้วยตนเองเป็นความรับผิดชอบในการจัดการขอบเขต / การอ้างอิงด้วยตนเองกับพอยน์เตอร์เหล่านั้น
ดูเหมือนว่าเป็นไปได้ที่จะเขียนโปรแกรมที่สามารถอ่านซอร์สของโปรแกรมและ:
- ทำนายการเรียงสับเปลี่ยนทั้งหมดของโฟลว์การควบคุมของโปรแกรม --- ไปยังความแม่นยำที่คล้ายกันในขณะที่ดูการทำงานจริงของโปรแกรม
- ติดตามการอ้างอิงทั้งหมดไปยังทรัพยากรที่จัดสรร
- สำหรับการอ้างอิงแต่ละครั้งให้ตรวจสอบการไหลของการควบคุมที่ตามมาทั้งหมดเพื่อหาจุดเริ่มต้นที่การอ้างอิงนั้นรับประกันว่าจะไม่ถูกยกเลิกการลงทะเบียน
- ณ จุดนั้นให้แทรกคำสั่งจัดสรรคืนที่บรรทัดของซอร์สโค้ด
มีอะไรอีกไหมที่ทำสิ่งนี้แล้ว? ฉันไม่คิดว่าตัวชี้สมาร์ท Rust หรือ C ++ / RAII เป็นสิ่งเดียวกัน