Hiểu rõ cấp phát động là gì, khi nào cần sử dụng và cách sử dụng đúng không chỉ giúp chương trình chạy chính xác, tiết kiệm bộ nhớ mà còn hạn chế các lỗi thường gặp trong phòng thi, từ đó nâng cao hiệu quả làm bài và sự tự tin của học sinh. Vậy hãy cùng Code Dream tìm câu trả lời Cấp phát động trong C++ là gì? Khi nào cần dùng và dùng thế nào? trong bài viết sau nhé!
Cấp phát bộ nhớ trong C++?
Ngôn ngữ C++ cung cấp ba hình thức cấp phát bộ nhớ chính.

Cấp phát bộ nhớ tĩnh (Static memory allocation)
- Áp dụng cho biến toàn cục và biến tĩnh.
- Bộ nhớ được cấp phát ngay khi chương trình bắt đầu chạy và chỉ được thu hồi khi chương trình kết thúc.
- Kích thước của biến hoặc mảng phải được xác định rõ ngay từ lúc biên dịch.
Cấp phát bộ nhớ tự động (Automatic memory allocation)
- Xuất hiện ở các biến cục bộ và tham số của hàm.
- Bộ nhớ chỉ tồn tại trong thời gian chương trình thực thi khối lệnh chứa biến đó; khi thoát khỏi khối lệnh, vùng nhớ sẽ tự động được giải phóng.
- Tương tự như cấp phát tĩnh, kích thước cũng phải biết trước khi biên dịch.
Cấp phát bộ nhớ động (Dynamic memory allocation)
Trong đa số chương trình thông thường, cấp phát tĩnh và tự động là đủ để sử dụng. Tuy nhiên, có những tình huống mà hai cách này không còn phù hợp.
Ví dụ:
Ta cần lưu tên người dùng nhưng không thể biết trước họ sẽ nhập bao nhiêu ký tự. Hoặc cần quản lý danh sách nhân viên của một công ty, trong khi số lượng nhân viên chưa xác định từ đầu.
Do với cấp phát tĩnh và tự động, kích thước biến phải cố định khi biên dịch, nên cách làm phổ biến là đặt ra một giới hạn tối đa:

Cách làm này tồn tại nhiều hạn chế:
Lãng phí bộ nhớ: Nếu công ty thực tế chỉ có 100 nhân viên, thì 400 phần tử còn lại hoàn toàn không được sử dụng.
Giới hạn bộ nhớ stack: Các biến cục bộ và mảng tĩnh thường nằm trên vùng nhớ stack, trong khi stack có dung lượng khá nhỏ (khoảng 1MB trong Visual Studio). Nếu khai báo vượt quá giới hạn này, chương trình sẽ bị lỗi stack overflow.
Thiếu linh hoạt: Nếu số nhân viên thực tế vượt quá 500 (ví dụ 600 người), chương trình sẽ không thể xử lý đúng do bị giới hạn bởi kích thước ban đầu.
Chính vì những bất cập trên, cấp phát bộ nhớ động được sử dụng để cho phép chương trình cấp phát và giải phóng bộ nhớ một cách linh hoạt trong quá trình chạy.

Tìm hiểu cấp phát động trong C++ và Cách dùng cấp phát động trong C++
Cấp phát bộ nhớ động cho phép chương trình yêu cầu bộ nhớ tại thời điểm đang chạy, thay vì phải xác định trước khi biên dịch. Vùng nhớ được sử dụng cho cơ chế này gọi là heap, do hệ điều hành trực tiếp quản lý. Trên các hệ thống hiện đại, heap có thể có dung lượng rất lớn, lên đến hàng gigabyte.

Cấp phát động cho biến đơn
Để cấp phát bộ nhớ động cho một biến, C++ sử dụng toán tử new:

Lệnh trên sẽ:
- Xin một vùng nhớ đủ để chứa kiểu int từ hệ điều hành.
- Tạo đối tượng tại vùng nhớ đó.
- Trả về địa chỉ của vùng nhớ dưới dạng một con trỏ.
Thông thường, ta cần một con trỏ để lưu địa chỉ này nhằm thao tác với dữ liệu:

Sau đó, có thể truy cập và thay đổi giá trị tại vùng nhớ thông qua con trỏ:

Khi cấp phát, ta cũng có thể khởi tạo giá trị ngay lập tức:

Giải phóng biến đơn (delete)
Khi một biến được cấp phát động không còn cần thiết, ta phải trả lại vùng nhớ đó cho hệ điều hành bằng toán tử delete:

Lưu ý rằng delete không xóa biến con trỏ, mà chỉ thu hồi vùng nhớ mà con trỏ đang trỏ tới. Sau khi delete, biến con trỏ vẫn tồn tại và có thể được gán giá trị khác.
Con trỏ lơ lửng (Dangling pointer)
Sau khi delete, nếu con trỏ vẫn giữ địa chỉ cũ thì nó đang trỏ đến một vùng nhớ không còn hợp lệ. Con trỏ như vậy được gọi là con trỏ lơ lửng. Việc:

Nhiều con trỏ cùng trỏ một vùng nhớ
Một vùng nhớ động có thể được nhiều con trỏ cùng trỏ tới. Khi vùng nhớ đó bị giải phóng, tất cả các con trỏ còn lại đều trở thành con trỏ lơ lửng.

Khuyến nghị:
- Hạn chế để nhiều con trỏ cùng quản lý một vùng nhớ.
- Sau khi delete, nếu còn tiếp tục dùng con trỏ, hãy gán nó bằng nullptr.
Con trỏ null và bộ nhớ động
Con trỏ null (nullptr) biểu thị rằng con trỏ không trỏ đến vùng nhớ hợp lệ nào. Điều này rất hữu ích khi làm việc với cấp phát động.

Lưu ý: delete với con trỏ nullptr là hoàn toàn an toàn và không gây lỗi.
Rò rỉ bộ nhớ (Memory leak)
Rò rỉ bộ nhớ xảy ra khi chương trình đánh mất địa chỉ của vùng nhớ động trước khi giải phóng nó.
Ví dụ 1: Con trỏ ra khỏi phạm vi

Khi hàm kết thúc, ptr bị hủy, nhưng vùng nhớ được cấp phát vẫn tồn tại mà không còn cách nào truy cập để delete. Đây chính là rò rỉ bộ nhớ.
Ví dụ 2: Gán lại con trỏ

Ví dụ 3: Cấp phát chồng lên nhau

Cách phòng tránh rò rỉ bộ nhớ
- Luôn delete bộ nhớ động trước khi con trỏ ra khỏi phạm vi.
- Giải phóng vùng nhớ trước khi gán con trỏ sang địa chỉ khác.
- Mỗi lần new phải đi kèm một lần delete.
- Sau khi delete, gán con trỏ về nullptr.
Những nguyên tắc này giúp chương trình sử dụng bộ nhớ hiệu quả, ổn định và tránh các lỗi khó kiểm soát trong C++.
Tóm lại, cấp phát bộ nhớ động là một trong những kiến thức nền tảng nhưng cũng rất quan trọng trong C++. Nó giúp chương trình trở nên linh hoạt hơn, sử dụng bộ nhớ hiệu quả hơn và giải quyết được những bài toán mà cấp phát tĩnh hay tự động không đáp ứng được. Tuy nhiên, đi kèm với sức mạnh đó là trách nhiệm quản lý bộ nhớ cẩn thận: cấp phát đúng lúc, giải phóng đúng chỗ, tránh con trỏ lơ lửng và rò rỉ bộ nhớ.
Trong các kỳ thi Tin học trẻ, HSG Tin hay khi học C++ ở mức nâng cao, việc hiểu khi nào cần dùng cấp phát động, dùng như thế nào cho đúng và an toàn là yếu tố giúp học sinh phân biệt rõ giữa “biết cú pháp” và “hiểu bản chất”.
Tại Code Dream, học sinh không chỉ học cách dùng new và delete, mà còn được rèn tư duy quản lý bộ nhớ, phân tích lỗi, tối ưu chương trình thông qua giáo trình độc quyền được xây dựng chuyên sâu cho lập trình thi đấu. Với đội ngũ giáo viên giàu kinh nghiệm đến từ các trường chuyên như Hà Nội – Amsterdam, Nguyễn Huệ, Chu Văn An…, Code Dream giúp học sinh nắm chắc nền tảng C++, sẵn sàng chinh phục các bài toán khó trong học tập và thi cử.
Hiểu đúng cấp phát động hôm nay chính là bước đệm quan trọng để tiến xa hơn trên con đường chinh phục Tin học thuật toán. Hãy liên hệ với chúng tôi ngay hôm nay để nhận được sự tư vấn miễn phí tốt nhất nhé.





