เขียนแอปพลิเคชัน Delphi ที่ไม่ทำให้การจัดสรรทรัพยากรขัดข้อง
สิ่งสำคัญคือต้องแน่ใจว่าหากมีการจัดสรรทรัพยากรในโปรแกรม แม้ว่าจะเกิดความล้มเหลวก็ตาม โปรแกรมก็ตาม
โปรแกรมควรจะสามารถปล่อยทรัพยากรที่ถูกครอบครองได้
ไฟล์ หน่วยความจำ ทรัพยากรของ WINDOWS และออบเจ็กต์คือบางส่วนที่ต้องเพิ่มเป็นครั้งคราว
ดูแลเพื่อให้แน่ใจว่าทรัพยากรถูกปล่อยออกมา ในตัวอย่างโค้ดควบคุมเหตุการณ์ต่อไปนี้
หน่วยความจำจะถูกจัดสรรก่อน จากนั้นจึงเกิดข้อผิดพลาด ทำให้ไม่สามารถดำเนินการได้อีกต่อไป
รหัสโปรแกรมเพื่อปล่อยหน่วยความจำ:
ขั้นตอนการดำเนินการTForm1. ButtonlClick(ผู้ส่ง:Tobject
-
วาร์
ตัวชี้ 1: ตัวชี้;
จำนวนเต็ม1,เลขศูนย์:จำนวนเต็ม;
เริ่ม
หมายเลขศูนย์:Κ0;
GetMem (Pointer1, 1024); {จัดสรรทรัพยากรหน่วยความจำ 1K}
จำนวนเต็ม1: Κ5divNumzero; {ประโยคนี้สร้างข้อผิดพลาดในการหาร
ข้อผิดพลาด}
FreeMem (Pointer1, 1024); {ประโยคนี้จะไม่ถูกดำเนินการที่นี่
ตกลง}สิ้นสุด;
แม้ว่าข้อผิดพลาดส่วนใหญ่จะไม่ชัดเจนนัก แต่ตัวอย่างข้างต้นก็มีความสำคัญ
จุดหนึ่ง: เมื่อเกิดข้อผิดพลาด การทำงานของโปรแกรมจะกระโดดออกจากโมดูล และรีซอร์สที่ตามมาจะถูกปล่อยออกมา
รหัสโปรแกรมจะไม่ถูกดำเนินการอีกต่อไป เพื่อให้แน่ใจว่า FreeMem ในตัวอย่างข้างต้นสามารถทำได้
หากต้องการปล่อยทรัพยากรหน่วยความจำที่ GetMem ครอบครอง โค้ดจะต้องถูกใส่ลงในทรัพยากร
โมดูลป้องกัน
นี่คือรูปแบบของโมดูลการป้องกันทรัพยากรแบบโค้ง:
{การจัดสรรทรัพยากร}
พยายาม
{การใช้ทรัพยากร}
ในที่สุด
{การเผยแพร่ทรัพยากร}
จบ;
ข้างต้นลอง. - - โมดูลสุดท้ายทำให้โปรแกรมสามารถรัน fi ได้ตลอดเวลา
??ไม่มีโค้ดโปรแกรมใดๆ ในส่วนนี้ แม้ว่าจะมีข้อผิดพลาดในโมดูลที่ได้รับการป้องกันก็ตาม
ผลิตใน เมื่อโค้ดในส่วน try ทำให้เกิดข้อผิดพลาดขณะดำเนินการ ให้ดำเนินการ
บรรทัดจะข้ามไปยังส่วนสุดท้ายโดยตรง หากไม่มีข้อผิดพลาดเกิดขึ้นระหว่างการดำเนินการ
โปรแกรมจะดำเนินการตามลำดับปกติ
ในตัวอย่างโค้ดควบคุมเหตุการณ์ต่อไปนี้ หน่วยความจำจะถูกจัดสรรก่อนแล้วจึง
เกิดข้อผิดพลาด แต่โค้ดโปรแกรมที่ปล่อยหน่วยความจำยังคงดำเนินการอยู่:
ขั้นตอนTForm1. Button1Click(ผู้ส่ง:Tobject
-
วาร์
ตัวชี้ 1: ตัวชี้;
จำนวนเต็ม1,เลขศูนย์:จำนวนเต็ม;
เริ่ม
หมายเลขศูนย์:Κ0;
GetMem (Pointer1, 1024); {จัดสรรทรัพยากรหน่วยความจำ 1K}
พยายาม
จำนวนเต็ม1: Κ5divNumzero; {ประโยคนี้สร้างข้อผิดพลาดในการหาร
ข้อผิดพลาด}
ในที่สุด
FreeMem(Pointer1,1024);{ที่นี่ประโยคนี้จะยังคงถูกดำเนินการ
ตกลง}
จบ;
จบ;
วิธีการตรวจสอบให้แน่ใจว่าโปรแกรมเผยแพร่ทรัพยากรที่ใช้ถือเป็นประเด็นสำคัญในการเขียนโปรแกรม
นี่เป็นปัญหาที่สำคัญมากที่ต้องฝึกฝนและใส่ใจในระหว่างการเขียนโปรแกรม