Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

กองล้นและกองล้น


ฮีปโอเวอร์โฟลว์

ฮีปใช้เพื่อเก็บตัวแปรไดนามิก เป็นพื้นที่ของหน่วยความจำของกระบวนการ 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];
}