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

Heap Overflow และ Stack Overflow ใน C++


Heap Overflow

Heap ใช้เก็บตัวแปรแบบไดนามิก (dynamic variables) เป็นพื้นที่หน่วยความจำของ process ฟังก์ชัน malloc(), calloc(), realloc() ใช้จองหน่วยความจำใน heap

Heap overflow เกิดขึ้นเมื่อ:

  • ก) จองตัวแปรไดนามิกจำนวนมากเกินไป
    int main() {
        float *ptr = (int *)malloc(sizeof(float)*1000000.0);
    }
  • ข) จองหน่วยความจำต่อเนื่องโดยไม่ free หลังใช้งาน
    int main() {
        for (int i=0; i<100000000000; i++) {
            int *p = (int *)malloc(sizeof(int));
        }
    }

Stack Overflow

Stack เป็นโครงสร้างข้อมูล LIFO ใช้เก็บตัวแปร local ภายในฟังก์ชัน พารามิเตอร์ และ return address หากโปรแกรมใช้หน่วยความจำเกินขนาด stack จะเกิด stack overflow

Stack overflow เกิดขึ้นเมื่อ:

  • ก) เรียกฟังก์ชันแบบ recursive ไม่มีที่สิ้นสุด
    void calculate(int a) {
        if (a == 0) return;
        a = 6;
        calculate(a);
    }
    int main() { int a = 5; calculate(a); }
  • ข) ประกาศตัวแปร local จำนวนมาก หรืออาเรย์ขนาดใหญ่
    int main() {
        int A[20000][20000];
    }