Phân biệt các vùng bộ nhớ trong C++


1. Stack Memory (Bộ nhớ ngăn xếp)

  • Dùng để lưu trữ biến cục bộ (local variables), tham số hàm, địa chỉ trả về.

  • Dung lượng nhỏ, tốc độ truy cập rất nhanh.

  • Tự động cấp phát và tự động giải phóng khi ra khỏi scope.

  • LIFO: Last In – First Out.

  • Không dùng new, delete.

Ví dụ:


 

void demo() { int a = 10; // a nằm trên stack double b = 3.14; // b nằm trên stack } // a và b tự hủy khi hàm kết thúc


2. Heap Memory (Bộ nhớ cấp phát động)

  • Dành cho các phần tử cấp phát động bằng new hoặc malloc.

  • Quản lý thủ công → lập trình viên phải delete để tránh rò rỉ bộ nhớ.

  • Dung lượng lớn hơn stack, nhưng chậm hơn.

  • Lưu trữ dữ liệu cần tồn tại lâu hơn phạm vi của hàm.

Ví dụ:


 

int* p = new int; // cấp phát 1 integer trên heap *p = 100; delete p; // bắt buộc giải phóng

Ví dụ mảng động:


 

int* arr = new int[5]; arr[0] = 1; arr[1] = 2; // ... delete[] arr;


3. Static / Global Memory

  • Chứa:

    • biến global

    • biến static

    • hằng số const

  • Được cấp phát 1 lần duy nhất, sống suốt chương trình.

Ví dụ:


 

int x = 5; // biến global static int y = 10; // biến static, lưu ở static memory void func() { static int c = 0; // tồn tại suốt chương trình, chỉ khởi tạo 1 lần c++; cout << c << endl; }


4. Code Segment (Text Segment)

  • Chứa mã lệnh (code) đã biên dịch.

  • Vùng chỉ đọc, không được phép thay đổi.

Ví dụ (không thể sửa giá trị hằng theo kiểu này, sẽ lỗi):


 

const char* s = "Hello"; s[0] = 'X'; // LỖI: vùng code nằm trong bộ nhớ chỉ đọc


So sánh nhanh

Vùng nhớ Cấp phát Giải phóng Tốc độ Dung lượng Ví dụ
Stack Tự động Tự động Rất nhanh Nhỏ int a;
Heap Thủ công Thủ công (delete) Chậm hơn Lớn new int
Static/Global Tĩnh Cuối chương trình Nhanh Vừa static int x;
Code Segment Tĩnh Không đổi N/A N/A Hàm, lệnh

Lỗi thường gặp

  1. Memory Leak – không delete khi dùng new


 

int* p = new int(10); // thiếu delete → rò rỉ bộ nhớ

  1. Dangling Pointer – con trỏ trỏ vào vùng đã giải phóng


 

int* p = new int(5); delete p; *p = 20; // LỖI nghiêm trọng

  1. Stack Overflow – dùng quá nhiều biến cục bộ, hoặc đệ quy sâu


 

void f() { f(); } // gây stack overflow


Kết luận

  • Stack: nhanh, tự quản lý nhưng giới hạn

  • Heap: linh hoạt, nhiều lỗi nếu không quản lý tốt

  • Static/Global: sống lâu, dễ lạm dụng

  • Code Segment: chứa lệnh, không can thiệp được

Hiểu rõ các vùng bộ nhớ giúp bạn:

  • Viết chương trình ổn định

  • Tối ưu hiệu năng

  • Tránh lỗi runtime khó dò