Search…

Cấp Phát Tĩnh và Cấp Phát Động

22/09/20203 min read
Giới thiệu và hướng dẫn cấp phát tĩnh và cấp phát động trong C/C++.

Khi khai báo một biến hoặc một mảng, cần cung cấp vùng nhớ để mảng này có khả năng lưu trữ giá trị.

Có hai cách cấp phát vùng nhớ:

  1. Cấp phát tĩnh.
  2. Cấp phát động.

Cấp phát tĩnh là gì?

Đây là kiểu cấp phát thông dụng trong ngôn ngữ C/C++, đây là kiểu cấp phát đã xác định được kích thước cần sử dụng trước khi biên dịch.

int a = 5;
int arr[10];

arr là:

  • Mảng tĩnh có 10 phần tử (hay 40 bytes) đã được xác định trước thời điểm biên dịch.
  • Các giá trị, biến này sẽ sẽ được lưu trữ trên Stack.
  • Các giá trị sẽ được tự động thu hồi khi ra khỏi tầm vực khai báo.

Lưu ý: khi khai báo mảng tĩnh, tham số ở trong cặp ngoặc vuông [ ] quy định số phần tử của mảng tĩnh phải là một hằng số.

Cấp phát động là gì?

Cấp phát động:

  • Tạo ra mảng hay 1 đối tượng với số lượng phần tử được xác định khi chương trình thực thi.
  • Các giá trị sẽ được lưu trữ trên Heap.
  • Khi không cần sử dụng phải chủ động thu hồi.
  • Để cấp phát động sử dụng hàm malloc/free (stdlib.h) trong C hoặc từ khóa new/delete trong C++.
int *a = new int;
int n = 10;
int *arr = new int[n]; 

a là một con trỏ quản lý 1 vùng giá trị có kích thước như biến int. Khi muốn truy xuất tới giá trị vùng nhớ đó cần sử dụng *

*a = 5;
cout << *a;

arr là con trỏ quản lý 1 vùng giá trị như mảng int[]. Cấp phát động lưu trữ toàn bộ vùng nhớ mà a và Arr tham chiếu tới vào bộ nhớ Heap.

Ưu điểm cấp phát động so với cấp phát tĩnh

Có thể sử dụng biến, hoặc giá trị trả về từ hàm làm tham số trong cặp ngoặc vuông [ ], ví dụ trên sử dụng biến n. Do đó, có thể kiểm soát kích thước của mảng động trước khi cấp phát, tránh tình trạng lãng phí bộ nhớ. Về cú pháp sử dụng có thể sử dụng cú pháp như mảng tĩnh khi truy cập các phần tử.

arr[0] = 5;
arr[1] = 10;
...
  • Cấp phát động lưu trữ vùng nhớ trong Heap, tùy nhu cầu lúc đang thực thi mà cấp phát (lvalue, rvalue: hằng số, truyền biến, giá trị lấy từ hàm), có thể cấp phát cho đến khi hết bộ nhớ.
  • Cấp phát tĩnh cấp phát vùng nhớ trong Stack, vùng nhớ Stack có giới hạn cho mỗi chương trình, kích thước phải xác định trước khi biên dịch (hằng số).

Khuyết điểm cấp phát động so với cấp phát tĩnh

  • Phải hoàn toàn kiểm soát được vùng nhớ động, chủ động thu hồi, tránh rò rỉ bộ nhớ.
  • Để làm được điều này chúng ta phải sử dụng đến từ khóa delete (C++) hoặc hàm free (C)
delete a;
delete[] arr;

Toán tử delete cho phép ta thu hồi vùng nhớ đã được cấp phát thông qua new (C++), khi đó vùng nhớ đó sẽ trở thành vùng nhớ tự do, có thể dùng để cấp phát tiếp hoặc cho các process khác sử dụng.

delete đối với vùng nhớ được cấp phát đơn; delete[] đối vùng nhớ được cấp phát dạng mảng.

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024