มีสองตำแหน่งที่สามารถใส่ตัวแปรในหน่วยความจำได้ เมื่อคุณสร้างตัวแปรดังนี้:
int a;
char c;
char d[16];
ตัวแปรถูกสร้างขึ้นใน " stack " ตัวแปรสแตกจะได้รับการปลดปล่อยโดยอัตโนมัติเมื่ออยู่นอกขอบเขต (นั่นคือเมื่อโค้ดไม่สามารถเข้าถึงได้อีกต่อไป) คุณอาจได้ยินพวกเขาเรียกว่าตัวแปร "อัตโนมัติ" แต่มันก็ดูไม่ทันสมัย
ตัวอย่างเริ่มต้นจำนวนมากจะใช้เฉพาะตัวแปรสแตก
สแต็กเป็นสิ่งที่ดีเพราะเป็นแบบอัตโนมัติ แต่ก็มีข้อบกพร่องสองประการ: (1) คอมไพเลอร์จำเป็นต้องรู้ล่วงหน้าว่าตัวแปรมีขนาดใหญ่เพียงใดและ (b) พื้นที่สแต็กค่อนข้าง จำกัด ตัวอย่างเช่นใน Windows ภายใต้การตั้งค่าเริ่มต้นสำหรับ Microsoft linker สแต็กจะถูกตั้งค่าเป็น 1 MB และไม่ใช่ทั้งหมดสำหรับตัวแปรของคุณ
หากคุณไม่ทราบว่าอาร์เรย์ของคุณมีขนาดใหญ่เพียงใดในเวลาคอมไพล์หรือถ้าคุณต้องการอาร์เรย์หรือโครงสร้างขนาดใหญ่คุณต้องมี "แผน B"
แผน B เรียกว่า " กอง " โดยปกติคุณสามารถสร้างตัวแปรให้ใหญ่เท่าที่ระบบปฏิบัติการจะให้คุณได้ แต่คุณต้องทำเอง การโพสต์ก่อนหน้านี้แสดงให้คุณเห็นวิธีหนึ่งที่คุณสามารถทำได้แม้ว่าจะมีวิธีอื่น ๆ :
int size;
char *p = (char *)malloc(size);
(โปรดทราบว่าตัวแปรในฮีปไม่ได้ถูกจัดการโดยตรง แต่ผ่านตัวชี้)
เมื่อคุณสร้างตัวแปรฮีปปัญหาคือคอมไพลเลอร์ไม่สามารถบอกได้ว่าคุณทำเสร็จเมื่อใดคุณจึงสูญเสียการรีลีสอัตโนมัติ นั่นคือที่มาของ "การปล่อยด้วยตนเอง" ที่คุณอ้างถึงตอนนี้รหัสของคุณมีหน้าที่ในการตัดสินใจว่าเมื่อใดที่ไม่ต้องการตัวแปรอีกต่อไปและปล่อยเพื่อให้หน่วยความจำสามารถนำไปใช้เพื่อวัตถุประสงค์อื่นได้ สำหรับกรณีข้างต้นด้วย:
free(p);
สิ่งที่ทำให้ตัวเลือกที่สองนี้เป็น "ธุรกิจที่น่ารังเกียจ" ก็คือไม่ใช่เรื่องง่ายเสมอไปที่จะรู้ว่าเมื่อใดไม่ต้องการตัวแปรอีกต่อไป การลืมปล่อยตัวแปรเมื่อคุณไม่ต้องการจะทำให้โปรแกรมของคุณใช้หน่วยความจำมากขึ้นที่จำเป็นต้องใช้ สถานการณ์นี้เรียกว่า "การรั่วไหล" ไม่สามารถใช้หน่วยความจำที่ "รั่วไหล" ได้จนกว่าโปรแกรมของคุณจะสิ้นสุดลงและระบบปฏิบัติการจะกู้คืนทรัพยากรทั้งหมด แม้แต่ปัญหาที่น่ากลัวกว่าก็เป็นไปได้หากคุณปล่อยตัวแปรฮีปโดยไม่ได้ตั้งใจก่อนที่จะดำเนินการกับมัน
ใน C และ C ++ คุณมีหน้าที่ล้างตัวแปรฮีปดังที่แสดงไว้ด้านบน อย่างไรก็ตามมีภาษาและสภาพแวดล้อมเช่นภาษา Java และ. NET เช่น C # ที่ใช้วิธีการอื่นซึ่งฮีปจะถูกล้างด้วยตัวเอง วิธีที่สองนี้เรียกว่า "การเก็บขยะ" เป็นวิธีที่ง่ายกว่ามากสำหรับนักพัฒนา แต่คุณต้องเสียค่าปรับในเรื่องค่าใช้จ่ายและประสิทธิภาพ มันเป็นความสมดุล
(ฉันได้อธิบายรายละเอียดมากมายเพื่อให้ง่ายขึ้น แต่หวังว่าจะได้คำตอบที่มีระดับมากกว่านี้)