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
newhoặcmalloc. -
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
-
Memory Leak – không delete khi dùng new
int* p = new int(10); // thiếu delete → rò rỉ bộ nhớ
-
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
-
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ò
- [THÔNG BÁO] – Lịch bảo vệ Capstone 1&2 (chỉnh thức) và Một số lưu ý quan trọng
- Giới thiệu khoá học IPv6 Address Planning Course (APNIC Academy)
- NHỮNG KĨ NĂNG CẦN THIẾT CỦA SINH VIÊN NĂM NHẤT TRONG THỜI ĐẠI CÔNG NGHỆ SỐ
- Hướng dẫn cài đặt Flask cho ứng dụng Python trên aaPanel
- CẢNG BIỂN VÀ CÁCH VẬN HÀNH CẢNG BIỂN