Cấp phát bộ nhớ động
▪ Giải phóng vùng nhớ: dùng hàm free() trong C.
▪ Khi thoát khỏi hàm, các biến khai báo trong hàm sẽ “biến mất”. Tuy nhiên các vùng nhớ được cấp phát động vẫn còn tồn tại và được “đánh dấu” là đang “được dùng”
→ bộ nhớ của máy tính sẽ hết.
Cấp phát bộ nhớ động
▪ Ví dụ: dùng malloc() or calloc() và free() nhập vào một mảng n số nguyên , in ra tổng các phần tử trong mảng
#include <iostream>
// thu vien dung cap phat dong #include <stdlib.h>
using namespace std; int main()
{
int n, i, *ptr, sum = 0;
cout<<"Nhap so luong phan tu:" ; cin >> n;
ptr = (int *)malloc(n * sizeof(int)); // cap phat dong
// ptr = (int *)calloc(n, sizeof(int)); // dung calloc
// check if cap phat ko thanh cong if (ptr == NULL)
{
printf("Co loi! khong the cap phat bo nho."); return 0;
}// …. // ….
// …
cout << "Nhap cac gia tri: "; for (i = 0; i < n; ++i)
{
cin >> *(ptr + i); // hoac dung cin >> ptr[i]; sum += *(ptr + i); // hoac dung sum += ptr[i];
}
cout<<"Tong = " << sum ;
// thu hoi vung nho
free(ptr);
return 0; }
Cấp phát bộ nhớ động
▪ Mở rộng vùng nhớ dùng realloc()
▪ Nếu việc cấp phát bộ nhớ động không đủ hoặc cần nhiều hơn mức đã cấp phát, bạn có thể thay đổi kích thước của bộ nhớ đã được cấp phát trước đó bằng cách sử dụng hàm.
▪ Cú pháp :
void *realloc(void *block, size_t size);
#include <iostream> #include <stdlib.h> using namespace std; int main() { int *ptr, i , n1, n2; cin >> n1; // nhap n1
ptr = (int*) malloc(n1 * sizeof(int));
cout << "Dia chi cua vung nho vua cap phat:" << ptr; cout << "\nNhap lai so luong phan tu: " ;
cin >> n2;
// cap nhat lai vung nho
ptr = (int*) realloc(ptr, n2 * sizeof(int));
cout << "Dia chi cua vung nho vua cap phat:" << ptr; // thu hoi vung nho
free(ptr); return 0; }
Cấp phát lại vùng nhớ có kích thước size do block trỏ đến trong vùng nhớ HEAP.
block == NULL ➔ sử dụng malloc size == 0 ➔ sử dụng free
Cấp phát bộ nhớ động
▪ Cấp phát động trong C++