หลายคนดูเหมือนจะรู้สึกว่าเมื่อคุณเพิ่มหน่วยความจำแล้วมันจะถูกส่งกลับไปยังระบบปฏิบัติการทันทีและสามารถใช้งานได้โดยโปรแกรมอื่น
สิ่งนี้ไม่เป็นความจริง ระบบปฏิบัติการทั่วไปจัดการหน่วยความจำในหน้า 4KiB malloc
และการจัดการหน่วยความจำประเภทอื่น ๆ จะได้รับเพจจากระบบปฏิบัติการและจัดการย่อยตามที่เห็นสมควร มีโอกาสมากที่free()
จะไม่ส่งคืนหน้าเว็บไปยังระบบปฏิบัติการภายใต้สมมติฐานว่าโปรแกรมของคุณจะทำให้หน่วยความจำเพิ่มขึ้นในภายหลัง
ฉันไม่ได้บอกว่าfree()
จะไม่ส่งคืนหน่วยความจำไปยังระบบปฏิบัติการ มันสามารถเกิดขึ้นได้โดยเฉพาะอย่างยิ่งถ้าคุณปลดปล่อยความทรงจำขนาดใหญ่ แต่ไม่มีการรับประกัน
ข้อเท็จจริงสำคัญ:หากคุณไม่เพิ่มหน่วยความจำที่คุณไม่ต้องการอีกต่อไป mallocs เพิ่มเติมจะรับประกันว่าจะใช้หน่วยความจำมากขึ้น แต่ถ้าคุณว่างก่อน malloc อาจใช้หน่วยความจำที่ว่างอีกครั้งแทน
ในทางปฏิบัติหมายความว่าอย่างไร หมายความว่าถ้าคุณรู้ว่าโปรแกรมของคุณจะไม่ต้องใช้หน่วยความจำเพิ่มอีกต่อไป (เช่นอยู่ในขั้นตอนการล้างข้อมูล) การเพิ่มหน่วยความจำจะไม่สำคัญ อย่างไรก็ตามหากโปรแกรมอาจจัดสรรหน่วยความจำเพิ่มเติมในภายหลังคุณควรหลีกเลี่ยงการรั่วไหลของหน่วยความจำ - โดยเฉพาะอย่างยิ่งที่อาจเกิดขึ้นซ้ำ ๆ
ดูความคิดเห็นนี้สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับสาเหตุที่ทำให้การเพิ่มหน่วยความจำก่อนการยกเลิกนั้นไม่ดี
ดูเหมือนว่าผู้วิจารณ์ไม่เข้าใจว่าการโทรfree()
ไม่อนุญาตให้โปรแกรมอื่นใช้หน่วยความจำที่ว่างโดยอัตโนมัติ แต่นั่นเป็นจุดรวมของคำตอบนี้!
ดังนั้นเพื่อโน้มน้าวใจผู้คนฉันจะแสดงตัวอย่างที่ฟรี () ทำได้ดีน้อยมาก เพื่อให้ง่ายต่อการคำนวณฉันจะแกล้งทำเป็นว่าระบบปฏิบัติการจัดการหน่วยความจำในหน้า 4000 ไบต์
สมมติว่าคุณจัดสรรบล็อกขนาด 100,000 ไบต์ (เพื่อความง่ายฉันจะเพิกเฉยต่อหน่วยความจำเพิ่มเติมที่จะต้องใช้ในการจัดการการจัดสรรเหล่านี้) สิ่งนี้ใช้ 1MB หรือ 250 หน้า ถ้าคุณสุ่ม 9000 บล็อกเหล่านี้โดยสุ่มคุณจะเหลือเพียง 1,000 บล็อก - แต่บล็อกเหล่านั้นกระจัดกระจายไปทั่ว ในทางสถิติประมาณ 5 หน้าจะว่างเปล่า อีก 245 คนจะมีบล็อกที่จัดสรรอย่างน้อยหนึ่งบล็อก จำนวนนั้นมีหน่วยความจำ 980KB ซึ่งไม่สามารถเรียกคืนได้จากระบบปฏิบัติการแม้ว่าตอนนี้คุณจะได้รับการจัดสรร 100KB เท่านั้น!
ในทางกลับกันคุณสามารถ malloc () 9000 บล็อกเพิ่มเติมโดยไม่เพิ่มจำนวนหน่วยความจำที่โปรแกรมของคุณคาดไว้
แม้ว่าในทางเทคนิคแล้วfree()
อาจส่งคืนหน่วยความจำไปยังระบบปฏิบัติการก็อาจไม่ทำเช่นนั้น ต้องการความสมดุลระหว่างการใช้งานอย่างรวดเร็วและประหยัดหน่วยความจำ และนอกจากนี้โปรแกรมที่จัดสรรหน่วยความจำจำนวนมากแล้วจึงทำให้มีแนวโน้มที่จะทำเช่นนั้นอีกครั้ง เว็บเซิร์ฟเวอร์จำเป็นต้องจัดการการร้องขอหลังจากที่ร้องขอหลังจากการร้องขอ - คุณควรเก็บหน่วยความจำ "หย่อน" ไว้เพื่อให้คุณไม่จำเป็นต้องถามหน่วยความจำ OS ตลอดเวลาfree()