หน่วยความจำที่รั่วไหลจะปลดปล่อยเมื่อออกจากโปรแกรมหรือไม่?


117

หากฉันตั้งโปรแกรม - โดยไม่รู้ตัว - หน่วยความจำรั่วและแอปพลิเคชันหยุดทำงานหน่วยความจำที่รั่วไหลจะเป็นอิสระหรือไม่?


มีประโยชน์มากคำตอบที่เกี่ยวข้อง: unix.stackexchange.com/questions/275184/…
Gabriel Staples

คำตอบ:


151

ใช่ "หน่วยความจำรั่ว" เป็นเพียงหน่วยความจำที่กระบวนการไม่มีการอ้างอิงอีกต่อไปและไม่สามารถปล่อยให้ว่างได้อีกต่อไป ระบบปฏิบัติการยังคงติดตามหน่วยความจำทั้งหมดที่จัดสรรให้กับกระบวนการและจะทำให้หน่วยความจำว่างลงเมื่อกระบวนการนั้นสิ้นสุดลง

ในกรณีส่วนใหญ่ระบบปฏิบัติการจะทำให้หน่วยความจำว่างเช่นเดียวกับ "รสชาติ" ปกติของ Windows, Linux, Solaris เป็นต้นอย่างไรก็ตามสิ่งสำคัญคือต้องทราบว่าในสภาพแวดล้อมเฉพาะเช่นระบบปฏิบัติการแบบเรียลไทม์ต่างๆ หน่วยความจำอาจไม่ได้รับการปลดปล่อยเมื่อโปรแกรมสิ้นสุดลง


4
คำถาม: ระบบปฏิบัติการติดตามการจัดสรรทั้งหมดหรือไม่ หน่วยความจำฮีปใด ๆ ที่คุณจัดสรรมาจากพื้นที่หน่วยความจำเสมือนของกระบวนการ - เมื่อกระบวนการสิ้นสุดลงพื้นที่นั้นจะถูกส่งกลับไปยังระบบขายส่งใช่ไหม ฉันไม่เห็นว่าเหตุใดจึงจำเป็นต้องมีการจัดทำบัญชีเพิ่มเติมเนื่องจากกระบวนการจัดสรรเป็นกระบวนการเดียว (ใน userland) ที่สามารถเข้าถึงหน้าเหล่านั้นได้ หรือฉันถูกสอนผิด?
Chris Tonkinson

6
@ จัสติน: โดยไม่ทราบระบบปฏิบัติการฉันไม่คิดว่ามันถูกต้อง อาจระบุระบบปฏิบัติการที่คุณกำลังพูดถึงอย่างชัดเจน
Brian R.Bondy

1
หมายเหตุ: มาตรฐานไม่ได้พูดอะไรเกี่ยวกับเรื่องนี้ นอกจากนี้ยังไม่รับประกัน นี่เป็นวิธีที่ใช้งานได้กับระบบปฏิบัติการสมัยใหม่ส่วนใหญ่หากไม่ใช่ทั้งหมด แต่ไม่จำเป็นต้องทำและในอดีตมีทั้งแบบที่พบบ่อยและไม่ได้ทำการล้างข้อมูลนี้
Edward Strange

5
มีระบบปฏิบัติการแบบเรียลไทม์ที่หลากหลายสำหรับอุปกรณ์ขนาดเล็กและอื่น ๆ ที่ไม่เรียกคืนหน่วยความจำที่สูญหายจากการรั่วไหล คำถามของคุณขึ้นอยู่กับระบบปฏิบัติการที่คุณกำลังพูดถึง
Brian Neal

14
แม้จะมีระบบปฏิบัติการที่ป้องกันหน่วยความจำเฉพาะคุณก็ยังต้องกำหนดคำว่า "รั่ว" เป็นไปได้มากที่แอปพลิเคชันจะจัดสรรทรัพยากร "ระบบ" นอกพื้นที่หน่วยความจำของตนเอง (แฮนเดิลมักใช้เพื่อระบุสิ่งเหล่านี้ในโลกของ Windows) การปิดแอปพลิเคชันของคุณไม่ได้ทำให้แน่ใจว่ามีการปล่อยทรัพยากรประเภทนี้
David

34

ระบบปฏิบัติการที่เรียกใช้โปรแกรมของคุณมักจะทำการล้างหน่วยความจำที่ไม่ได้รับการปลดปล่อยอย่างชัดเจนและจัดการที่ไม่ได้ปิดอย่างชัดเจน แต่มาตรฐาน C ++ ไม่รับประกัน คุณอาจพบอุปกรณ์ฝังตัวบางตัวที่ไม่ทำให้หน่วยความจำของคุณรั่วไหล

ที่กล่าวว่า Windows และ distros ทั้งหมดของ Linux ที่ฉันเคยเห็นมานั้นทำให้หน่วยความจำรั่วไหล

คุณสามารถสร้างการรั่วไหลของหน่วยความจำขนาดใหญ่ได้อย่างง่ายดายเพื่อทดสอบด้วยตัวคุณเอง ดูการใช้ RAM ของคุณเพิ่มขึ้นแล้วปิดโปรแกรมของคุณ คุณจะเห็นว่าการใช้งานแรมลดลง


ข้อควรพิจารณาอีกประการหนึ่งเมื่อใช้ C ++ คือหากคุณไม่ได้ลบหน่วยความจำที่จัดสรรฮีปของคุณผู้ทำลายของคุณจะไม่ถูกเรียกด้วย บางครั้งคุณอาจได้รับผลข้างเคียงอื่น ๆ เช่นกันหากไม่ได้เรียกผู้ทำลายของคุณ


14

คุณใช้ระบบปฏิบัติการเดสก์ท็อป (Windows, Linux ฯลฯ ) หรือไม่ ในกรณีนี้ใช่โดยทั่วไประบบจะเพิ่มหน่วยความจำที่เกี่ยวข้องกับโปรแกรมเมื่อโปรแกรมออก


10

โดยปกติแล้วใช่ บางระบบรองรับสิ่งต่างๆเช่นบล็อกหน่วยความจำแบบแบ่งใช้ที่ไม่ได้ปลดปล่อยโดยอัตโนมัติเมื่อโปรแกรมออกจากระบบ ส่วนใหญ่ยังคงนับการอ้างอิงและลบทิ้งเมื่อโปรแกรมทั้งหมดที่เปิดมันออก แต่มีไม่กี่รายการ (เช่น Windows 16 บิตมีรายการบางประเภทที่จะยังคงจัดสรรแม้ว่าจะไม่มีการอ้างถึงก็ตาม - แม้ว่า มันมักจะพังด้วยสาเหตุอื่นก่อนที่จะสะสมมากพอที่จะทำให้เกิดปัญหา ... )


5

เท่าที่ฉันรู้ระบบปฏิบัติการที่ทันสมัยจะทำให้หน่วยความจำนี้ว่างเมื่อโปรแกรมหยุดทำงาน


4

ขึ้นอยู่กับหน่วยความจำที่คุณรั่วไหล ระบบปฏิบัติการไม่สามารถเรียกคืนหน่วยความจำบางส่วนได้ อย่างไรก็ตามหน่วยความจำส่วนใหญ่ในระบบปฏิบัติการส่วนใหญ่จะถูกเรียกคืนโดยอัตโนมัติเมื่อกระบวนการออก


6
ระบบปฏิบัติการไม่สามารถเรียกคืนหน่วยความจำบางส่วนได้เช่นอะไร

2
ในระบบปฏิบัติการแบบเรียลไทม์บางอย่างฉันเคยเห็นบล็อกบัฟเฟอร์อีเธอร์เน็ตพิเศษที่ไม่ได้รับการล้างข้อมูลเมื่อกระบวนการออก
Brian Neal

1
โดยปกติหน่วยความจำที่ใช้ร่วมกันจะไม่ถูกเรียกคืนเนื่องจากคุณอาจต้องการให้ยังคงอยู่เพื่อให้กระบวนการชั่วคราวใช้งานได้
Brian Neal
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.