ฮีปโอเวอร์โฟลว์
ฮีปใช้เพื่อเก็บตัวแปรไดนามิก เป็นพื้นที่ของหน่วยความจำของกระบวนการ 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));
}
} ล้นกอง
สแต็กเป็นโครงสร้างข้อมูลแบบเข้าก่อนออกก่อน มันถูกใช้เพื่อเก็บตัวแปรท้องถิ่นที่ใช้ภายในฟังก์ชัน พารามิเตอร์จะถูกส่งผ่านฟังก์ชันนี้และที่อยู่ผู้ส่ง
หากโปรแกรมใช้พื้นที่หน่วยความจำมากขึ้น สแต็คโอเวอร์โฟลว์จะเกิดขึ้นเนื่องจากขนาดของสแต็กถูกจำกัดในหน่วยความจำคอมพิวเตอร์
กองล้นเกิดขึ้นเมื่อ
A) หากฟังก์ชันถูกเรียกซ้ำโดยตัวมันเองโดยไม่จำกัดเวลาแล้ว stack จะไม่สามารถเก็บตัวแปรท้องถิ่นจำนวนมากได้ ดังนั้น stack overflow จะเกิดขึ้น -
void calculate(int a) {
if (a== 0)
return;
a = 6;
calculate(a);
}
int main() {
int a = 5;
calculate(a);
} B) หากเราประกาศตัวแปรในเครื่องจำนวนมากหรือประกาศอาร์เรย์หรือเมทริกซ์มิติขนาดใหญ่อาจส่งผลให้สแต็กโอเวอร์โฟลว์ได้
int main() {
A[20000][20000];
}