17
จะเกิดอะไรขึ้นเมื่อคุณไม่ว่างหลังจาก malloc?
นี่เป็นสิ่งที่รบกวนฉันมานานแล้ว เราทุกคนได้รับการสอนในโรงเรียน (อย่างน้อยฉันเป็น) ที่คุณต้องเป็นอิสระทุกตัวชี้ที่ได้รับการจัดสรร แต่ฉันก็อยากรู้อยากเห็นเกี่ยวกับต้นทุนที่แท้จริงของการไม่เพิ่มหน่วยความจำ ในบางกรณีที่เห็นได้ชัดเช่นเมื่อmallocมีการเรียกภายในลูปหรือส่วนหนึ่งของการประมวลผลเธรดเป็นสิ่งสำคัญมากที่จะต้องว่างดังนั้นจึงไม่มีหน่วยความจำรั่วไหล แต่ลองพิจารณาสองตัวอย่างต่อไปนี้: ก่อนอื่นถ้าฉันมีรหัสนั่นเป็นอย่างนี้: int main() { char *a = malloc(1024); /* Do some arbitrary stuff with 'a' (no alloc functions) */ return 0; } ผลลัพธ์ที่แท้จริงที่นี่คืออะไร ความคิดของฉันคือกระบวนการตายแล้วพื้นที่ฮีปก็หายไปดังนั้นจึงไม่มีอันตรายใด ๆ ในการที่จะพลาดการเรียกfree(แต่ฉันตระหนักถึงความสำคัญของการมีมันต่อไปสำหรับการปิดการบำรุงรักษาและการปฏิบัติที่ดี) ฉันคิดถูกไหม? ประการที่สองสมมติว่าฉันมีโปรแกรมที่ทำหน้าที่เหมือนเชลล์ ผู้ใช้สามารถประกาศตัวแปรเช่นaaa = 123นั้นและจะถูกเก็บไว้ในโครงสร้างข้อมูลแบบไดนามิกบางอย่างเพื่อใช้ในภายหลัง เห็นได้ชัดว่าดูเหมือนว่าคุณจะใช้วิธีแก้ปัญหาบางอย่างที่จะเรียกใช้ฟังก์ชันการจัดสรร * บางอย่าง (hashmap, รายการที่ลิงก์, สิ่งที่คล้ายกัน) สำหรับโปรแกรมประเภทนี้มันไม่สมเหตุสมผลเลยที่จะโทรฟรีmallocเพราะตัวแปรเหล่านี้จะต้องปรากฏตลอดเวลาในระหว่างการดำเนินการของโปรแกรมและไม่มีวิธีที่ดี (ที่ฉันเห็น) ในการดำเนินการนี้ด้วยการจัดสรรพื้นที่แบบคงที่ เป็นการออกแบบที่ไม่ดีที่จะมีหน่วยความจำจำนวนมากที่จัดสรรไว้ แต่ปล่อยให้เป็นอิสระซึ่งเป็นส่วนหนึ่งของกระบวนการที่สิ้นสุด ถ้าเป็นเช่นนั้นทางเลือกคืออะไร?