Search…

Cấp Phát Động trong C++

11/09/20203 min read
Tìm hiểu cấp phát bộ nhớ động trong C++ và vì sao sử dụng cấp phát động?

Cấp phát tĩnh và cấp phát động là gì?

  • Cấp phát tĩnh: kích thước của dữ liệu cần cấp phát phải xác định trước khi chương trình được biên dịch.
  • Cấp phát động: kích thước của dữ liệu được xác định khi chương trình đang thực thi và cấp phát trong quá trình thực thi.

Tài nguyên bộ nhớ máy tính là có hạn, không thể sử dụng mà không có sự tính toán. Việc quản lý bộ nhớ là điều quan trọng và cần thiết.

Nếu đơn thuần sử dụng cấp phát tĩnh (quyết định kích thước vùng nhớ trước biên dịch) sẽ không thể cấp phát được 1 bộ nhớ linh động vừa đủ dùng cho các trường hợp lưu trữ hình ảnh, phim, nhạc, ...

Cách sử dụng

Sử dụng từ khóa new để cấp phát bộ nhớ cho khi thực thi.

Thay thế new bằng new[] khi cần cấp phát nhiều ô nhớ (dưới dạng mảng):

int *a = new int;
int *b = new int[10];

Khi đó, chương trình sẽ cấp phát cho các biến một vùng nhớ liên tục có kích thước là số lượng phần tử * sizeof(kiểu dữ liệu).

Với cấp phát động, sử dụng con trỏ để quản lý các vùng nhớ này thông qua địa chỉ của các vùng nhớ đó.

Các biến con trỏ thông thường được lưu trên Stack Segment, trong khi vùng nhớ mà nó trỏ đến sẽ được lưu trên Heap Segment.

Có thể thao tác với các vùng nhớ cấp phát động giống như với mảng tĩnh thông qua chỉ số index hoặc sử dụng toán tử + trong trường hợp này không mang ý nghĩa cộng giá trị mà là "tăng giá trị con trỏ" hay "trỏ con trỏ vào các phần tử kế tiếp".

Nếu không sử dụng vùng nhớ cấp phát động nữa, hãy huỷ nó bằng từ khóa delete hoặc delete[] tương ứng với mảng. Nếu không huỷ vùng nhớ này khi cần bộ nhớ có thể không còn bộ nhớ để cấp phát mới.

Ví dụ minh hoạ sau:

#include <stdio.h>

int main()
{
	int *a = new int[10];
	
	for (int i = 0; i < 10; i++)
	{
		scanf("%d", &a[i]);
	}
	for (int i = 0; i < 10; i++)
	{
		printf("%-4d", *(a + i));
	}

	delete[] a;
	return 0;
}

Tại sao nên sử dụng cấp phát động?

Rất nhiều trường hợp thực tế không xác định được số lượng ô nhớ cần thiết để lưu trữ dữ liệu, ví dụ:

  • Tính năng sao chép file, nhưng file không thể xác định được trước kích thước.
  • Nạp 1 file nhạc vào bộ nhớ để phát.

... mà đến khi chương trình thực thi, mới xác định được cần thao tác trên file nào, hoặc bài hát nào từ đó mới biết cần bao nhiêu dung lượng lưu trữ.

Sẽ rất lãng phí nếu chuẩn bị sẵn 1 vùng nhớ quá lớn để lưu trữ dư thừa hoặc sẽ bị thiếu nếu chuẩn bị quá ít. Cấp phát động sẽ giúp chương trình sử dụng vùng nhớ linh hoạt hơn.

Ngoài ra còn một số lợi ích khác của cấp phát động như sau:

  • Có thể cấp phát vùng nhớ có kích thước bất kỳ bằng cách truyền tham số vào trong cặp dấu [ ] khi cấp phát vùng nhớ. Việc cấp phát tĩnh không cho phép truyền vào tham số để cấp phát vùng nhớ.
  • Có thể tái sử dụng vùng nhớ sau khi được huỷ bằng toán tử delete.
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