3.9.2 Cấp phát bộ nhớ động (1)

Trong các ví dụ chúng ta đã thấy từ đầu cho đến nay, việc quản lý bộ nhớ đã diễn ra bên ngoài ý thức của chúng ta. Các bộ nhớ mà chúng ta đã sử dụng để lưu trữ các giá trị được đại diện bởi tên của biến và mảng. Chúng xuất hiện ngay khi chúng được khai báo và biến mất khi chương trình của chúng ta kết thúc hoạt động. Tất cả các công việc liên quan đến cấp phát bộ nhớ được thực hiện bởi trình biên dịch và chúng ta không quan tâm làm thế nào nó làm việc đó.

Các ngôn ngữ bậc cao và các trình biên dịch của chúng được thiết kế để giải phóng trách nhiệm cho lập trình viên khỏi việc quản lý bộ nhớ.

Đôi khi các lập trình viên muốn có toàn quyền kiểm soát bao nhiêu bộ nhớ được sử dụng và chính xác khi nào nó được cấp phát. Điều này đặc biệt quan trọng khi bạn không biết trước về kích thước của dữ liệu được xử lý là bao nhiêu. Để quản lý việc cấp phát và giải phóng bộ nhớ, ngôn ngữ C++ cho chúng ta hai từ khóa đặt biệt là new  delete.

Từ khoá new được sử dụng để yêu cầu cấp phát bộ nhớ mới. Khi bộ nhớ được cấp phát không còn cần thiết nữa thì cần phải trả về cho hệ điều hành, chúng ta làm việc này với từ khóa delete.


Từ khóa new có thể được sử dụng theo cách sau:

  • nó cần các thông số kỹ xác về thực thể đang được tạo ra; nó phải mô tả kiểu dữ liệu và nếu thực thể được tạo ra là một mảng thì kích thước của mảng cũng phải được cung cấp (như trong ví dụ đầu tiên)
  • trả về một con trỏ có kiểu phù hợp với thực thể mới được tạo ra
  • vùng bộ nhớ vừa được cấp phát chưa được reset nên nó có thể chứa dữ liệu rác

Khi chúng ta không cần dùng đến bộ nhớ đã được cấp phát nữa, chúng ta có thể giải phóng nó bằng cách sử dụng từ khóa delete theo cách sau →

  • sử dụng delete [] nếu muốn giải phóng bộ nhớ được cấp phát cho một mảng, sử dụng delete nếu muốn giải phóng bộ nhớ được cấp phát cho một biến
  • chỉ có thể giải phóng toàn bộ vùng nhớ đã được cấp phát chứ giải phóng được một phần của nó
  • sau khi thực hiện giải phóng bộ nhớ, tất cả các con trỏ trỏ đến dữ liệu bên trong khu vực đã giải phóng sẽ trở thành bất hợp pháp; cố gắng sử dụng chúng có thể dẫn đến việc chết chương trình.