C, C++ : Cấp Phát Vùng Nhớ Động
Hello. Chào mừng các bạn đến với blog: Phát Triển Phần Mềm 123AZ.
Chủ đề học lập trình c++ mở rộng, nâng cao. Bài viết này chúng ta sẽ cùng ôn lại để nắm chắc kiến thức về.
Kỹ thuật cấp phát vùng nhớ động trong C++ và C.
Về cơ bản cấp phát vùng nhớ động nó mang lại nhiều lợi ích hơn so với việc cấp phát tĩnh.
Nó đóng vai trò trong yếu tố quyết định.
Chất lượng phần mềm, tốc độ xử lý
Dung lượng sử dụng tài nguyên của máy tính.
Tỉ lệ bug cao hay thấp.
Trong C và C++ có những hàm cấp phát và quản lý vùng nhớ khác nhau.
Do đó đôi khi chúng ta có sự lẫn lộn trong các sử dụng, cũng như vai trò và chức năng của chúng có một vài điểm khác nhau,
mà nếu không hiểu rõ, chúng ta có thể sử dụng chưa hiệu quả.
1. Hàm malloc
Là một hàm cơ bản trong việc cấp phát bộ nhớ, sử dụng trong ngôn ngữ lập trình C
Cách khai báo khi sử dụng.
#include <stdlib.h> // khai báo để sử dụng hàm malloc int main(void) { int *p ; p= (int*)malloc(5*sizeof(int)) ; }
Câu lệnh cấp phát trên được phân tích như sau:
- P là một con trỏ được khai báo để trỏ vào vùng dữ liệu có kiểu số nguyên int (số nguyên có dấu)
- Hàm malloc yêu cầu bộ nhớ cấp phát 5 ô nhớ liên tiếp cho p.
- Mỗi ô nhớ có kích thước = kích thước của biến int .
- Dữ liệu của các ô nhớ ban đầu chưa được thiết lập, và chúng được ép về kiểu int.
Như vậy số byte cấp phát = 5*sizeof (int)
Trong hệ điều hành 16 bit: int có kích thước là 2 byte
Hệ điều hành 32 bit: int có kích thước là 4 byte.
Con trỏ p sẽ bắt đầu trỏ vào ô nhớ đầu tiên.
2.Hàm calloc
Chỉ khác hàm malloc tại 2 điểm.
- Thay vì sử dụng 1 Tham số = số lượng vùng nhớ * với kích thước kiểu dữ liệu. Calloc tách biệt chúng ra thành 2 tham số riêng biệt.
- Calloc khởi tạo giá trị ban đầu cho các vùng nhớ.
- Ví dụ: int = 0, double = 0.0, char = ‘\0’
#include <stdlib.h> int main(void) { char *p ; p = (int*)calloc(5, sizeof(char)) ; }
Hàm Calloc sẽ có 2 đối số, đố số 1 là số lượng , đối số 2 sẽ là kích thước 1 phần tử ô nhớ cần cấp phát. Có nghĩa tổng số byte cấp phát là 5*sizeof(char)) byte
Một điểm khác nữa giữa calloc với malloc là calloc vừa cấp phát vừa khởi tạo giá trị ban đầu của các ô nhớ = 0.
3.Hàm realloc
– Nó thay đổi kích thước vùng nhớ do một con trỏ trỏ đến.
#include "stdafx.h" #include <stdlib.h> int main(void) { int *p ; int a[5]={4,5,6}; p = (int*)malloc(5*sizeof(int)) ; p = a; int * q ; q =(int*)realloc(p,2) }
- Con trỏ p sẽ được cấp phát bởi malloc, và trỏ vào mảng dữ liệu a có 5 phần tử với 3 phần tử được khởi tạo giá trị
- realloc cấp phát thêm cho con trỏ p thêm 2 ô nhớ và sử dụng con tro q để trỏ đến
=> p = q bao gồm 7 ô nhớ kiểu int trong đó 3 ô nhớ có dữ liệu của p lúc ban đầu vẫn được giữ nguyên.
4.Hàm free
Dùng để giải phóng vùng nhớ cho 3 hàm trên , sử dụng cho ngôn ngữ C
Cấu trúc của nó là :
void free (void * p)
free(p)
5.Hàm New
Giống như hàm malloc nhưng được sử dụng trong C ++.
int main(void) { int *p ; p = new int [5]; }
Cấp phát 5 ô nhớ kiểu int cho con trỏ p, ko khởi tạo value ban đầu
6.Hàm Delete
Giải phóng vùng nhớ được cấp phát bởi toán tử new, chỉ dùng trong c ++
Nếu p chỉ được cấp phát một vùng nhớ.
delete p ;
Nếu P được cấp phát một số lượng vùng nhớ.
delete [] p ;
Ok, trên đây là những hàm cơ bản và phổ biến được sử dung trong các dự án với hai ngôn ngữ lập trình c và c++.
Hãy sử dụng chúng thật linh hoạt, tối ưu, điều đó sẽ giúp bạn cấp phát và quản lý vùng nhớ hiệu quả trong các dự án của mình.
______________
Pass Pham