Vùng bộ nhớ ngăn xếp chứa các biến cục bộ và các tham số hàm. Dữ liệu trong ngăn xếp được quản lý tự động (cấp phát và giải phóng khi vào/thoát khỏi hàm).
Kích thước cố định, hoạt động nhanh nhưng có giới hạn về kích thước và không linh hoạt như vùng nhớ heap.
Heap (Đống)
Vùng nhớ heap dùng để lưu trữ các biến mà cần quản lý bộ nhớ động. Người lập trình có quyền chủ động cấp phát và giải phóng bộ nhớ trong vùng nhớ này.
Cấp phát linh hoạt hơn stack, kích thước có thể lớn hơn, nhưng quản lý phức tạp hơn vì cần giải phóng thủ công.
Dynamic Memory Allocation (Cấp phát bộ nhớ động)
Quá trình cấp phát bộ nhớ trong lúc chạy, khi kích thước bộ nhớ cần sử dụng không xác định trước. Sử dụng các hàm như malloc, calloc, realloc trong C và new trong C++.
Static Memory Allocation (Cấp phát bộ nhớ tĩnh)
Bộ nhớ được cấp phát trước khi chương trình chạy và tồn tại đến khi chương trình kết thúc. Ví dụ như các biến toàn cục và các biến static.
Được quản lý bởi hệ thống, không cần giải phóng thủ công.
Cấp phát bộ nhớ tại thời gian biên dịch, áp dụng cho các biến tĩnh, biến toàn cục.
Automatic Memory Allocation (Cấp phát bộ nhớ tự động)
Bộ nhớ được quản lý tự động bởi hệ thống, thường liên quan đến các biến cục bộ trong ngăn xếp.
Bộ nhớ của các biến cục bộ trong hàm được cấp phát tự động trong stack khi hàm được gọi và tự động giải phóng khi hàm kết thúc.
Không cần quản lý thủ công, nhanh chóng nhưng chỉ có trong phạm vi của hàm.
Pointer (Con trỏ)
Biến lưu địa chỉ của vùng nhớ khác, cho phép truy cập gián tiếp đến các vùng nhớ. Con trỏ thường được sử dụng để quản lý bộ nhớ động.
Biến lưu trữ địa chỉ của vùng bộ nhớ, có thể trỏ đến bất kỳ kiểu dữ liệu nào.
Memory Leak (Rò rỉ bộ nhớ)
Hiện tượng vùng nhớ động được cấp phát nhưng không được giải phóng, dẫn đến mất đi bộ nhớ khả dụng của chương trình gây lãng phí tài nguyên. Rất dễ gặp khi sử dụng new hoặc malloc mà không có delete hoặc free.
Dangling Pointer (Con trỏ rỗng)
Con trỏ trỏ đến vùng nhớ đã bị giải phóng hoặc không còn hợp lệ. Sử dụng con trỏ rỗng sẽ gây lỗi hoặc hành vi không xác định.
malloc (Memory Allocation)
Hàm trong C để cấp phát bộ nhớ động từ heap và trả về con trỏ void. Dữ liệu trong bộ nhớ này không được khởi tạo.
calloc (Contiguous Allocation)
Hàm cấp phát bộ nhớ động trong C, nhưng bộ nhớ được khởi tạo về 0. Dùng để cấp phát một vùng nhớ lớn có các ô nhớ liên tục.
realloc (Reallocation)
Hàm trong C để thay đổi kích thước của vùng nhớ đã được cấp phát trước đó bằng malloc hoặc calloc. Dữ liệu cũ sẽ được sao chép vào vùng nhớ mới.
free
Hàm giải phóng bộ nhớ đã được cấp phát bằng malloc, calloc, hoặc realloc trong C.
new và delete
Toán tử trong C++ dùng để cấp phát (new) và giải phóng (delete) bộ nhớ động.
new[] và delete[]
Dùng để cấp phát (new[]) và giải phóng (delete[]) bộ nhớ động cho mảng trong C++.
RAII (Resource Acquisition Is Initialization)
Một nguyên tắc quản lý tài nguyên trong C++ dựa trên ý tưởng rằng tài nguyên (bộ nhớ, file,...) được cấp phát khi khởi tạo đối tượng và tự động giải phóng khi đối tượng bị hủy.
Sử dụng đối tượng dạng smart pointer để quản lý bộ nhớ.
Smart Pointer (Con trỏ thông minh)
Con trỏ trong C++ quản lý bộ nhớ động theo cơ chế tự động giải phóng khi không còn tham chiếu. Các loại phổ biến là std::unique_ptr, std::shared_ptr, std::weak_ptr.
Memory Pool (Bể bộ nhớ)
Một vùng bộ nhớ lớn được cấp phát trước để quản lý nhiều đối tượng nhỏ, giúp giảm thời gian và tối ưu quản lý bộ nhớ.
Thường dùng trong hệ thống yêu cầu hiệu năng cao như game.
Alignment (Căn chỉnh bộ nhớ)
Quy tắc sắp xếp dữ liệu trên các địa chỉ cụ thể để phù hợp với kiến trúc CPU, giúp truy xuất bộ nhớ hiệu quả hơn. Các kiểu dữ liệu thường được căn chỉnh cho các vị trí cụ thể (ví dụ: bội của 4, 8).
Ứng dụng tối ưu hiệu suất, tránh lỗi truy cập bộ nhớ.
Placement New
Biến thể của new trong C++, cho phép cấp phát đối tượng tại một địa chỉ cụ thể.
Memory Fragmentation (Phân mảnh bộ nhớ)
Hiện tượng bộ nhớ trống bị chia nhỏ thành nhiều phần không liên tục sau khi nhiều vùng nhớ được cấp phát và giải phóng, gây lãng phí bộ nhớ và giảm hiệu quả cấp phát.
Sự phân mảnh vùng nhớ động do cấp phát và giải phóng không đều.
Zero-fill Allocation
Cấp phát bộ nhớ mà toàn bộ vùng được khởi tạo về 0. calloc là ví dụ cho cấp phát kiểu này.
Garbage Value
Là giá trị ngẫu nhiên còn lại trong bộ nhớ mà biến chưa được khởi tạo ban đầu. Hiện tượng này thường xảy ra với:
Các biến cục bộ trong stack chưa được gán giá trị.
Bộ nhớ động cấp phát bằng malloc trong C, vì malloc không khởi tạo giá trị (chỉ cấp phát vùng nhớ trống).
Double Free
Lỗi xảy ra khi một vùng nhớ được giải phóng nhiều lần, dẫn đến hành vi không xác định.
Use-After-Free
Sử dụng vùng nhớ sau khi đã giải phóng, dẫn đến lỗi nghiêm trọng.
Out-of-Bounds Access
Truy cập vượt giới hạn bộ nhớ của một mảng hoặc vùng cấp phát động.
Valgrind
Công cụ phổ biến để kiểm tra và phân tích quản lý bộ nhớ, phát hiện rò rỉ bộ nhớ và lỗi truy cập.
Overhead
Chi phí phụ thuộc vào quản lý bộ nhớ động (metadata hoặc dữ liệu hệ thống).
Unaligned Access
Truy cập bộ nhớ không được căn chỉnh đúng cách, thường làm giảm hiệu suất hoặc gây lỗi trên một số kiến trúc.
Memory Debugger
Công cụ giúp phát hiện lỗi liên quan đến bộ nhớ như Valgrind, AddressSanitizer.
Memory Padding
Thêm các byte đệm vào cấu trúc dữ liệu để đảm bảo căn chỉnh bộ nhớ hoặc tối ưu hóa tốc độ.
Global Object Initialization
Quá trình khởi tạo bộ nhớ cho các đối tượng toàn cục trước khi chương trình chính bắt đầu.
Stack Overflow
Lỗi xảy ra khi vùng nhớ stack bị đầy, thường do đệ quy quá sâu hoặc sử dụng biến lớn trong stack.
Heap Corruption
Vùng nhớ heap bị hỏng do ghi đè dữ liệu hoặc giải phóng không đúng cách.
AddressSanitizer
Công cụ kiểm tra runtime của trình biên dịch giúp phát hiện các lỗi quản lý bộ nhớ như tràn bộ đệm, rò rỉ bộ nhớ.
Shallow Copy và Deep Copy
Kỹ thuật sao chép dữ liệu: Shallow Copy chỉ sao chép địa chỉ con trỏ, còn Deep Copy sao chép nội dung dữ liệu.
Pointer Arithmetic
Phép toán trên con trỏ để di chuyển qua các ô nhớ.
Segmentation Fault
Lỗi do truy cập vào vùng nhớ không hợp lệ.
Volatile Memory
Bộ nhớ dễ bị thay đổi không thể đoán trước, như các biến liên quan đến phần cứng hoặc đa luồng.