Cấp phát vùng nhớ động làm một kỹ thuật quan trọng, cần thiết và được sử dụng chủ yếu trong các dự án phần mềm, nó mang lại lợi ích nhiều hơn so với việc cấp phát vùng nhớ tĩnh.
Một sản phẩm phần mềm chất lượng hay không, tốc độ chạy thế nào, tỷ lệ bug phát sinh cao hay thấp, một phần phụ thộc vào việc cấp phát và sử dụng vùng nhớ hiệu quả của mỗi lập trình viên.
Trong C và C++ có những hàm cấp phát và quản lý vùng nhớ khác nhau, và 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.
Ex:
#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 mallocyê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
Trong 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’
Ex:
#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.
Ex:
#include "stdafx.h"
#include <stdlib.h>
int main(void)
{
int *p ;
inta[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 ;
______________________________________________________________Damme88 (Phamtoanbonmat@gmail.com)

Không có nhận xét nào:
Đăng nhận xét