ฮีปโอเวอร์โฟลว์
ฮีปใช้เพื่อเก็บตัวแปรไดนามิก เป็นพื้นที่ของหน่วยความจำของกระบวนการ malloc(), calloc(), resize() ฟังก์ชัน inbuilt ทั้งหมดนี้มักใช้เพื่อจัดเก็บตัวแปรไดนามิก
ฮีปล้นเกิดขึ้นเมื่อ −
A) หากเราจัดสรรตัวแปรจำนวนมากแบบไดนามิก -
int main() { float *ptr = (int *)malloc(sizeof(float)*1000000.0)); }
B) หากเราจัดสรรหน่วยความจำอย่างต่อเนื่องและไม่ว่างหลังจากใช้งาน
int main() { for (int i=0; i<100000000000; i++) { int *p = (int *)malloc(sizeof(int)); } }
ล้นกอง
Stack เป็นโครงสร้างข้อมูลแบบเข้าก่อนออกก่อน มันถูกใช้เพื่อเก็บตัวแปรท้องถิ่นที่ใช้ภายในฟังก์ชัน พารามิเตอร์จะถูกส่งผ่านฟังก์ชันนี้และที่อยู่ผู้ส่ง
หากโปรแกรมใช้พื้นที่หน่วยความจำมากขึ้น สแต็คโอเวอร์โฟลว์จะเกิดขึ้นเนื่องจากขนาดของสแต็กถูกจำกัดในหน่วยความจำคอมพิวเตอร์
กองล้นเกิดขึ้นเมื่อ -
C) หากฟังก์ชันถูกเรียกซ้ำโดยตัวมันเองโดยไม่จำกัดเวลาแล้ว stack จะไม่สามารถเก็บตัวแปรท้องถิ่นจำนวนมากได้ ดังนั้น stack overflow จะเกิดขึ้น -
void calculate(int a) { if (a== 0) return; a = 6; calculate(a); } int main() { int a = 5; calculate(a); }
D) หากเราประกาศตัวแปรในเครื่องจำนวนมากหรือประกาศอาร์เรย์หรือเมทริกซ์มิติขนาดใหญ่อาจส่งผลให้สแต็กโอเวอร์โฟลว์ได้
int main() { A[20000][20000] }